ใครจะจัดเก็บข้อมูลบริบททั่วโลกในระบบส่วนประกอบนิติบุคคล?


10

คำถามของฉันคือ:

วิธีหนึ่งจะเก็บข้อมูลบริบททั่วโลกเช่น ข้อมูลข้อมูลโลกเวลาโลกปัจจุบัน ฯลฯ ในระบบองค์ประกอบเอนทิตี

ฉันคิดว่าจะทำงานเพื่อสร้างเกมจำลองสถานการณ์แบบเปิดของ Dwarf Fortress สไตล์โลกใน C ++ ฉันได้สร้างเอ็นจิ้นเกมสไตล์เอนทิตีเพื่อความสนุกและตอนนี้ฉันกำลังพยายามหาวิธีที่ฉันจะทำงานในคุณสมบัติทั้งหมดที่ฉันต้องการ นอกเหนือจากการเล่นเกมมาตรฐาน (การเรนเดอร์ฟิสิกส์ข้อมูลส่วนประกอบเฉพาะเอนทิตี ฯลฯ ) แล้วฉันยังต้องการมีข้อมูลบริบทระดับโลกที่ระบบที่เกี่ยวข้องทั้งหมดสามารถเข้าถึงได้ (เช่นข้อมูลโลกเช่นปีปัจจุบัน ไม่ว่าจะเกิดภาวะโลกร้อนหรืออะไรก็ตามที่เกี่ยวข้องกับการจำลองโลก) เดิมทีฉันเคยคิดที่จะสร้างองค์ประกอบ "โลก" แต่มันดูไร้จุดหมายและยากหากระบบต่าง ๆ มากมายต้องการเข้าถึงข้อมูล "ทั่วโลก" อย่างมีเหตุผล

มันจะสมเหตุสมผลไหมที่จะมีองค์ประกอบ "โลก" หรือฉันควรเก็บข้อมูลนี้ด้วยวิธีอื่น?

ฉันยังคิดที่จะทำให้ข้อมูลนี้เป็นสากลดังนั้นจึงให้การเข้าถึงระบบใด ๆ ที่ต้องการใช้งาน ดูเหมือนเป็นการละเมิดหลักการองค์ประกอบเอนทิตี้โดยทั่วไปและอาจยุ่งเหยิงด้วยเหตุผลอื่น แต่ฉันคิดว่ามันอาจใช้งานได้จริง

สิ่งอื่นที่ฉันคิดว่าน่าจะฝังข้อมูลบริบทโลกที่เกี่ยวข้องลงในระบบโดยตรง ตัวอย่างเช่นถ้าฉันมีAgeSystem"อายุ" เอนทิตีทั้งหมดที่มีgetsWeakerAsTimePassesส่วนประกอบหรืออะไรก็ตามบางทีระบบนี้อาจเก็บข้อมูลเวลาที่เกี่ยวข้องสำหรับโลกโดยตรงเป็นข้อมูลสมาชิกที่จะใช้ในการคำนวณเวลาที่ผ่านไปและจำนวนเท่าใด อายุและความอ่อนแอของผู้คน ฯลฯ ตัวเลือกที่สามนี้เป็นสิ่งที่ฉันชอบน้อยที่สุด แต่สิ่งที่เกิดขึ้นกับฉันในการระดมสมอง

มีใครให้คำแนะนำได้บ้าง


3
เหตุผลสำหรับ downvotes นั้นสุภาพและมีประโยชน์ไม่เพียง แต่ OP แต่สำหรับผู้ใช้อื่น ๆ
MichaelHouse

2
คุณได้สร้างค้อนและตอนนี้ทุกอย่างดูเหมือนเล็บ ฉันอนุญาตให้คุณใช้มากกว่าแค่ ECS เพื่อเก็บและจัดการข้อมูลในโปรแกรมของคุณเพราะไม่ใช่ว่าทุกอย่างจะเป็นสิ่งที่ดี
Patrick Hughes

คำตอบ:


10

วิธีการทำงานใด ๆ เป็นวิธีการทำงาน นั่นฟังดูน่ารังเกียจ แต่จริงๆแล้วเกมของคุณมีความสำคัญมากกว่าสถาปัตยกรรมของคุณถึง 1,000 เท่า เลือกวิธีการใด ๆ ที่คุณชอบและค้นหาใช้งานง่าย

สิ่งที่ฉันเคยเห็นในเกมการขนส่งจริง (โดยใช้การออกแบบที่อิงองค์ประกอบไม่ใช่ ECS โดยเฉพาะฉันไม่เคยเห็น ECS บริสุทธิ์ "ในป่า" ถึงแม้ว่าการออกแบบส่วนประกอบจำนวนมากจะมีองค์ประกอบคล้ายกับ ECS):

  • singletons
  • วัตถุ "บริบท" ถูกส่งไปยังส่วนประกอบ / ระบบที่มีการอ้างอิงถึงระบบอื่น ๆ ที่เกี่ยวข้องทั้งหมด
  • โรงงานผลิตส่วนประกอบที่ผ่านระบบจัดการไปยังส่วนประกอบแต่ละรายการ
  • ส่วนประกอบที่จัดเก็บการอ้างอิงถึงระบบในรากของลำดับชั้นวัตถุ (เฉพาะในเกม Unity คี่บอลบางเกม)
  • วัตถุ "เครื่องยนต์" เอกพจน์ส่งผ่านไปยังระบบหรือส่วนประกอบที่เก็บการอ้างอิงถึงระบบอื่น ๆ ทั้งหมด
  • ระบบการค้นหาทรัพยากรแบบอิงสตริง (อนุญาตให้คุณใน C ++ ทำสิ่งที่handle<PhysicsSystem> = GetResource<PhysicsSystem>("/systems/physics")ใช่ใช่จริง ๆ )
  • กองข้อมูลทั่วโลกและฟังก์ชั่นฟรีสไตล์ C ที่ใช้งานได้
  • Spaces / subspacesและวิดีโอประกอบ

พวกเขาทั้งหมดทำงาน ฉันมีวิธีบางอย่างและเป็นเกมโปรดที่เห็นได้ชัด แต่พวกเขาทุกคนคุ้นเคยกับเกม AAA บางครั้งมีหลายวิธีในโครงการเดียว (ทีมวิศวกร 40-100+ คนมักจะสร้างรหัสที่ซ้ำกันโดยพลัน)


2
ฉันอยากรู้ว่าสิ่งใดที่คุณโปรดปรานชัดเจน
ashes999

ลิงก์ที่ฉันให้ไว้คือสไลด์ของฉันและวิดีโอของฉันที่จะพูดคุยเกี่ยวกับหัวข้อหากมีคำใบ้ใด ๆ :)
Sean Middleditch

Ah ดังนั้นที่คุณชื่นชอบเป็นช่องว่าง / subspacesแล้ว :)
ashes999

คำตอบที่ดี ฉันคิดว่าฉันมีสิ่งที่ออกกำลังกายและจริง ๆ แล้วฉันไปข้างหน้าและรวมแนวคิด "ช่องว่าง / subspaces" ใน gameplan ของฉัน
Awesomania
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.