คำถามติดแท็ก entity-system

กระบวนทัศน์การเขียนโปรแกรมที่ gameobjects (เอนทิตี) ประกอบด้วยองค์ประกอบและดำเนินการโดยระบบ แต่ละเอนทิตีคือ ID ที่ชี้ไปยังส่วนประกอบเฉพาะ

1
อะไรคือบทบาทของ“ ระบบ” ในสถาปัตยกรรมเอนทิตีที่อิงองค์ประกอบ
ฉันได้อ่านเกี่ยวกับองค์ประกอบและระบบเอนทิตีและได้คิดว่าความคิดของเอนทิตีที่เพิ่งเป็น ID นั้นค่อนข้างน่าสนใจ อย่างไรก็ตามฉันไม่ทราบวิธีการทำงานอย่างสมบูรณ์กับองค์ประกอบด้านหรือด้านระบบ ส่วนประกอบเป็นเพียงวัตถุข้อมูลที่จัดการโดยระบบที่เกี่ยวข้อง ระบบการชนใช้ BoundsComponent ร่วมกับโครงสร้างข้อมูลเชิงพื้นที่เพื่อพิจารณาว่ามีการชนกันหรือไม่ ดีมากจนถึงตอนนี้ แต่ถ้าระบบหลาย ๆ ระบบต้องการเข้าถึงส่วนประกอบเดียวกัน ข้อมูลควรอยู่ที่ไหน ระบบอินพุตสามารถแก้ไขเอนทิตี BoundsComponent แต่ระบบฟิสิกส์ต้องการการเข้าถึงองค์ประกอบเดียวกันเช่นเดียวกับระบบการเรนเดอร์บางระบบ นอกจากนี้นิติบุคคลจะสร้างอย่างไร ข้อดีอย่างหนึ่งที่ฉันได้อ่านมามากคือความยืดหยุ่นในการสร้างเอนทิตี ระบบเชื่อมโยงกับส่วนประกอบอย่างแท้จริงหรือไม่? หากฉันต้องการแนะนำส่วนประกอบใหม่บางอย่างฉันต้องแนะนำระบบใหม่หรือแก้ไขส่วนประกอบที่มีอยู่ด้วยหรือไม่? อีกสิ่งที่ฉันได้อ่านบ่อยๆก็คือ 'ประเภท' ของเอนทิตีถูกอนุมานด้วยส่วนประกอบที่มันมี หากเอนทิตีของฉันเป็นเพียง ID ฉันจะรู้ได้อย่างไรว่าเอนทิตีโรบ็อตของฉันต้องถูกย้ายหรือเรนเดอร์และทำการแก้ไขโดยระบบบางระบบ ขออภัยสำหรับการโพสต์ยาว (หรืออย่างน้อยก็ดูเหมือนจากหน้าจอโทรศัพท์ของฉัน)!

9
การสื่อสารแบบเอนทิตีทำงานอย่างไร
ฉันมีสองกรณีผู้ใช้: จะentity_Aส่งtake-damageข้อความถึงentity_Bอย่างไร HP จะentity_Aค้นหาด้วยวิธีentity_Bใด นี่คือสิ่งที่ฉันได้พบ: คิวข้อความ entity_Aสร้างtake-damageข้อความและโพสต์ไปentity_Bที่คิวข้อความของ entity_Aสร้างข้อความและโพสต์ไปยัง query-hp ในการกลับมาสร้างข้อความและโพสต์ไปยังentity_Bentity_Bresponse-hpentity_A เผยแพร่ / สมัครสมาชิก entity_Bสมัครรับtake-damageข้อความ (อาจเป็นไปได้ว่ามีการกรองบางอย่างเพื่อให้ส่งเฉพาะข้อความที่เกี่ยวข้องเท่านั้น) entity_Aผลิตข้อความที่อ้างอิงtake-damageentity_B entity_Aสมัครรับupdate-hpข้อความ (อาจถูกกรอง) ทุกเฟรมentity_Bออกอากาศupdate-hpข้อความ สัญญาณ / สล็อต ??? entity_Aเชื่อมตupdate-hpสล็อตentity_B's update-hpสัญญาณ มีอะไรที่ดีกว่านี้ไหม? ฉันมีความเข้าใจที่ถูกต้องหรือไม่ว่าโครงร่างการสื่อสารเหล่านี้จะผูกเข้ากับระบบเอนทิตีของเอ็นจิ้นเกมได้อย่างไร

1
การใช้ระบบเอนทิตีตามองค์ประกอบจริง
เมื่อวานนี้ฉันได้อ่านงานนำเสนอจาก GDC Canada เกี่ยวกับระบบเอนทิตีแอตทริบิวต์ / พฤติกรรมและฉันคิดว่ามันยอดเยี่ยมมาก อย่างไรก็ตามฉันไม่แน่ใจว่าจะใช้งานได้อย่างไรไม่ใช่ในทางทฤษฎี ก่อนอื่นฉันจะอธิบายให้คุณทราบอย่างรวดเร็วว่าระบบนี้ทำงานอย่างไร แต่ละเอนทิตีเกม (เกมวัตถุ) ประกอบด้วยคุณลักษณะ (= ข้อมูลซึ่งสามารถเข้าถึงได้โดยพฤติกรรม แต่ยังรวมถึง 'รหัสภายนอก') และพฤติกรรม (= ตรรกะซึ่งมีOnUpdate()และOnMessage()) ดังนั้นสำหรับตัวอย่างเช่นในโคลนฝ่าวงล้อมอิฐแต่ละคนจะต้องประกอบด้วย (ตัวอย่าง): PositionAttribute , ColorAttribute , HealthAttribute , RenderableBehaviour , HitBehaviour คนสุดท้ายอาจมีลักษณะเช่นนี้ (เป็นเพียงตัวอย่างที่ไม่ทำงานเขียนใน C #): void OnMessage(Message m) { if (m is CollisionMessage) // CollisionMessage is inherited from Message { Entity otherEntity …

3
ในเอ็นจินเอ็นติตี้ - คอมโพเนนต์ - ระบบฉันจะจัดการกับกลุ่มของเอนทิตีที่พึ่งพาได้อย่างไร
หลังจากผ่านรูปแบบการออกแบบเกมมาสองสามครั้งฉันได้ตกลงกับ Entity-Component-System (ระบบ ES) สำหรับเอ็นจิ้นเกมของฉัน ฉันอ่านบทความ (ส่วนใหญ่เป็นT = Machine ) และตรวจสอบซอร์สโค้ดและฉันคิดว่าฉันเริ่มต้นได้เพียงพอแล้ว มีเพียงแนวคิดพื้นฐานเดียวที่ฉันกำลังดิ้นรนอยู่ ฉันจะจัดการกับกลุ่มของเอนทิตีที่ต้องพึ่งพาซึ่งกันและกันได้อย่างไร ให้ฉันใช้ตัวอย่าง: สมมติว่าฉันสร้างปืนเหนือศีรษะแบบมาตรฐาน (คิดว่าเจมส์ทาวน์ ) และฉันต้องการสร้าง "หัวหน้าเอนทิตี" ที่มีหลายส่วนที่แตกต่างกัน แต่เชื่อมต่อกัน การพังทลายอาจมีลักษณะเช่นนี้: ตัวเรือ: การเคลื่อนไหว, การแสดงผล ปืนใหญ่: ตำแหน่ง (ล็อคโดยสัมพันธ์กับตัวเรือ), ติดตาม \ Fire ที่ฮีโร่, สร้างความเสียหายจนกว่าจะปิดการใช้งาน แกนหลัก: ตำแหน่ง (ล็อคโดยสัมพันธ์กับตัวเรือ), การติดตาม \ Fire ที่ฮีโร่, ทำความเสียหายจนกว่าจะปิดการใช้งาน, ปิดใช้งาน (เอ่อ ... ทำลาย) เอนทิตีอื่น ๆ ทั้งหมดในกลุ่มเรือ เป้าหมายของฉันจะเป็นสิ่งที่จะระบุ (และจัดการ) …

4
ระบบส่วนประกอบ / ส่วนประกอบใน C ++ ฉันจะค้นหาชนิดและสร้างส่วนประกอบได้อย่างไร
ฉันกำลังทำงานกับระบบส่วนประกอบเอนทิตีใน C ++ ที่ฉันหวังว่าจะเป็นไปตามสไตล์ของอาร์ทิมิส (http://piemaster.net/2011/07/entity-component-artemis/) ในส่วนประกอบนั้นส่วนใหญ่เป็นถุงข้อมูลและเป็น ระบบที่มีตรรกะ ฉันหวังว่าจะใช้ประโยชน์จาก data-centess-ness ของวิธีการนี้และสร้างเครื่องมือเนื้อหาที่ดี อย่างไรก็ตามหนึ่งโคกที่ฉันเจอคือวิธีการใช้สตริงตัวระบุหรือ GUID จากไฟล์ข้อมูลและใช้เพื่อสร้างส่วนประกอบสำหรับ Entity เห็นได้ชัดว่าฉันสามารถมีฟังก์ชั่นการแยกวิเคราะห์ขนาดใหญ่ได้หนึ่งรายการ: Component* ParseComponentType(const std::string &typeName) { if (typeName == "RenderComponent") { return new RenderComponent(); } else if (typeName == "TransformComponent") { return new TransformComponent(); } else { return NULL: } } แต่นั่นน่าเกลียดจริงๆ ฉันตั้งใจจะเพิ่มและแก้ไขส่วนประกอบบ่อยครั้งและหวังว่าจะสร้าง ScriptedComponentComponent บางประเภทเช่นที่คุณสามารถนำส่วนประกอบและระบบมาใช้ใน Lua …

1
แคชเอนทิตีระบบมีประสิทธิภาพอย่างไร?
เมื่อเร็ว ๆ นี้ฉันได้ทำการอ่านมากมายเกี่ยวกับระบบเอนทิตีเพื่อนำไปใช้ในเอ็นจิ้นเกม C ++ / OpenGL ของฉัน ประโยชน์หลักสองประการที่ฉันได้ยินอย่างต่อเนื่องเกี่ยวกับระบบเอนทิตีคือ การสร้างเอนทิตีแบบใหม่ ๆ ได้ง่ายเนื่องจากไม่ต้องยุ่งเกี่ยวกับลำดับชั้นการสืบทอดที่ซับซ้อนและ ประสิทธิภาพแคชซึ่งฉันมีปัญหาในการทำความเข้าใจ ทฤษฎีนี้เรียบง่ายแน่นอน แต่ละองค์ประกอบจะถูกเก็บไว้อย่างต่อเนื่องในบล็อกของหน่วยความจำดังนั้นระบบที่ใส่ใจเกี่ยวกับองค์ประกอบนั้นสามารถทำซ้ำในรายการทั้งหมดโดยไม่ต้องกระโดดไปรอบ ๆ ในหน่วยความจำและฆ่าแคช ปัญหาคือฉันไม่สามารถคิดถึงสถานการณ์ที่เป็นจริงได้ อันดับแรกให้ดูที่การจัดเก็บส่วนประกอบและวิธีการอ้างอิงซึ่งกันและกัน ระบบจำเป็นต้องทำงานกับส่วนประกอบได้มากกว่าหนึ่งองค์ประกอบนั่นคือทั้งระบบเรนเดอร์และระบบฟิสิกส์จำเป็นต้องเข้าถึงส่วนประกอบที่แปลงสภาพ ฉันได้เห็นการใช้งานที่เป็นไปได้หลายอย่างซึ่งกล่าวถึงเรื่องนี้และไม่มีสิ่งใดที่ทำได้ดี คุณสามารถมีพอยน์เตอร์เก็บส่วนประกอบไปยังส่วนประกอบอื่น ๆ หรือพอยน์เตอร์ไปยังเอนทิตีที่เก็บพอยน์เตอร์ไปยังส่วนประกอบ อย่างไรก็ตามทันทีที่คุณส่งพอยน์เตอร์ไปผสมคุณก็ฆ่าประสิทธิภาพของแคชแล้ว คุณสามารถมั่นใจได้ว่าทุกองค์ประกอบของอาเรย์นั้นมีขนาดใหญ่ 'n' โดยที่ 'n' คือจำนวนเอนทิตีที่มีอยู่ในระบบ สิ่งนี้ทำให้ยากมากในการเพิ่มประเภทส่วนประกอบใหม่ลงในเอ็นจิ้น แต่ยังคงทิ้งประสิทธิภาพของแคชไว้เพราะคุณกำลังกระโดดจากอาร์เรย์หนึ่งไปยังอีกอาร์เรย์หนึ่ง คุณสามารถแทรกเอนทิตี้ของอาร์เรย์แทนการเก็บอาร์เรย์แยกต่างหาก แต่คุณยังคงสูญเสียความจำ ทำให้ราคาแพงอย่างไม่น่าเชื่อในการเพิ่มส่วนประกอบหรือระบบใหม่ แต่ตอนนี้มีประโยชน์เพิ่มเติมของการทำให้ระดับเก่าทั้งหมดของคุณเป็นโมฆะและบันทึกไฟล์ นี่คือทั้งหมดที่สมมติว่าเอนทิตีถูกประมวลผลเชิงเส้นในรายการทุกเฟรมหรือติ๊ก ในความเป็นจริงนี่ไม่ใช่กรณี สมมติว่าคุณใช้เซกเตอร์ / พอร์ทัลเรนเดอร์หรืออ็อคทรีเพื่อทำการคัดแยก คุณอาจเก็บเอนทิตีต่อเนื่องกันภายในเซกเตอร์ / โหนด แต่คุณจะกระโดดไปมาไม่ว่าคุณจะชอบหรือไม่ก็ตาม จากนั้นคุณมีระบบอื่น ๆ ซึ่งอาจต้องการเอนทิตีที่จัดเก็บตามลำดับอื่น AI อาจไม่เป็นไรสำหรับการจัดเก็บรายการใหญ่จนกว่าคุณจะเริ่มทำงานกับ …

5
ฉันจะใช้คุณสมบัติต่าง ๆ ในระบบเอนทิตีได้อย่างไร
หลังจากถามคำถามสองข้อเกี่ยวกับระบบเอนทิตี ( 1 , 2 ) และอ่านบทความเกี่ยวกับพวกเขาฉันคิดว่าฉันเข้าใจพวกเขาดีขึ้นกว่า แต่ก่อน ฉันยังมีความไม่แน่นอนอยู่บ้างส่วนใหญ่เกี่ยวกับการสร้างตัวส่งอนุภาคระบบอินพุตและกล้อง เห็นได้ชัดว่าฉันยังคงมีปัญหาในการทำความเข้าใจกับระบบเอนทิตีและพวกเขาอาจนำไปใช้กับวัตถุช่วงอื่น ๆ ทั้งหมด แต่ฉันเลือกสามข้อนี้เพราะมันเป็นแนวคิดที่แตกต่างกันมาก จัดการปัญหาเช่นนี้ด้วยตัวเองเมื่อพวกเขามา ฉันกำลังสร้างเอ็นจิ้นใน JavaScript และฉันได้นำคุณสมบัติหลักมาใช้ซึ่งรวมถึง: การจัดการอินพุต, ระบบภาพเคลื่อนไหวที่ยืดหยุ่น, ตัวส่งอนุภาค, คลาสคณิตศาสตร์และฟังก์ชั่น, การจัดการฉาก, กล้องและเรนเดอร์ ของสิ่งอื่น ๆ ที่เครื่องยนต์มักจะสนับสนุน ฉันอ่านคำตอบของ Byte56 ซึ่งทำให้ฉันสนใจที่จะทำให้เครื่องยนต์กลายเป็นระบบเอนทิตี มันจะยังคงเป็นเอ็นจิ้นเกม HTML5 ที่มีปรัชญาฉากพื้นฐาน แต่ควรสนับสนุนการสร้างเอนทิตีจากส่วนประกอบ ปัญหาที่ฉันมีตอนนี้คือปรับแนวคิดเครื่องยนต์เก่าของฉันให้เข้ากับกระบวนทัศน์การเขียนโปรแกรมใหม่นี้ นี่คือคำจำกัดความบางส่วนจากคำถามก่อนหน้านี้ที่อัปเดต: Entityเป็นตัวระบุ มันไม่มีข้อมูลใด ๆ ไม่ใช่วัตถุมันเป็นรหัสง่าย ๆ ที่แสดงดัชนีในรายการฉากของเอนทิตีทั้งหมด (ซึ่งจริง ๆ แล้วฉันวางแผนที่จะใช้เป็นเมทริกซ์คอมโพเนนต์) ตัวแทนเป็นผู้ถือข้อมูล แต่ด้วยวิธีการที่สามารถทำงานกับข้อมูลที่ ตัวอย่างที่ดีที่สุดคือองค์ประกอบVector2Dหรือ "ตำแหน่ง" มันมีข้อมูล: xและyแต่ยังมีบางส่วนวิธีการที่ทำให้การดำเนินงานเกี่ยวกับข้อมูลง่ายขึ้นเล็กน้อย: …

3
วิธีการนำการจัดการข้อความไปใช้อย่างเหมาะสมในระบบเอนทิตีที่อิงองค์ประกอบเป็นหลัก
ฉันกำลังใช้ชุดตัวเลือกของระบบเอนทิตีที่มี: ระดับ Entityที่มีน้อยกว่าประชาชนที่ผูกส่วนประกอบเข้าด้วยกัน กลุ่มของคลาสคอมโพเนนต์ที่ไม่มี "ตรรกะของคอมโพเนนต์" ซึ่งเป็นข้อมูลเท่านั้น กลุ่มของคลาสระบบ (aka "ระบบย่อย", "ผู้จัดการ") สิ่งเหล่านี้ทำการประมวลผลตรรกะเอนทิตีทั้งหมด ในกรณีพื้นฐานส่วนใหญ่ระบบจะทำซ้ำรายการของเอนทิตีที่พวกเขาสนใจและดำเนินการกับแต่ละรายการ วัตถุชั้น MessageChannelที่ใช้ร่วมกันโดยระบบเกมทั้งหมด แต่ละระบบสามารถสมัครสมาชิกเพื่อรับฟังข้อความบางประเภทและยังสามารถใช้ช่องทางในการส่งข้อความไปยังระบบอื่น ๆ ตัวแปรเริ่มต้นของการจัดการข้อความระบบมีดังนี้: เรียกใช้การอัปเดตในแต่ละระบบเกมตามลำดับ หากระบบทำบางสิ่งบางอย่างกับองค์ประกอบและการกระทำนั้นอาจเป็นที่สนใจของระบบอื่น ๆ ระบบจะส่งข้อความที่เหมาะสม (ตัวอย่างเช่นการเรียกระบบ messageChannel.Broadcast(new EntityMovedMessage(entity, oldPosition, newPosition)) เมื่อใดก็ตามที่มีการย้ายเอนทิตี) แต่ละระบบที่สมัครรับข้อความที่ระบุจะได้รับวิธีการจัดการข้อความ หากระบบกำลังจัดการเหตุการณ์และตรรกะการประมวลผลเหตุการณ์ต้องการข้อความอื่นที่จะเผยแพร่ข้อความจะได้รับการถ่ายทอดทันทีและวิธีการประมวลผลข้อความอีกสายหนึ่งถูกเรียก ตัวแปรนี้ก็โอเคจนกระทั่งฉันเริ่มปรับระบบตรวจจับการชนกันให้เหมาะสม (มันช้าลงจริงๆเมื่อจำนวนของเอนทิตีเพิ่มขึ้น) ในตอนแรกมันแค่วนซ้ำเอนทิตีแต่ละคู่โดยใช้อัลกอริทึมแรงเดรัจฉานอย่างง่าย จากนั้นฉันก็เพิ่ม "ดัชนีเชิงพื้นที่" ที่มีตารางของเซลล์ที่เก็บเอนทิตีที่อยู่ภายในพื้นที่ของเซลล์ที่เฉพาะเจาะจงจึงอนุญาตให้ทำการตรวจสอบเฉพาะเอนทิตีในเซลล์ข้างเคียง ทุกครั้งที่เอนทิตีย้ายระบบการชนจะตรวจสอบว่าเอนทิตีชนกับบางสิ่งในตำแหน่งใหม่หรือไม่ หากเป็นเช่นนั้นการชนจะได้รับการตรวจพบ และถ้าทั้งสองหน่วยงานชนกันเป็น "วัตถุทางกายภาพ" (ทั้งคู่มีองค์ประกอบ RigidBody และตั้งใจที่จะผลักกันออกไปเพื่อไม่ให้ครอบครองพื้นที่เดียวกัน) ระบบแยกตัวแข็งโดยเฉพาะขอให้ระบบการเคลื่อนไหวย้ายหน่วยงานไปบางส่วน ตำแหน่งเฉพาะที่จะแยกพวกเขา สิ่งนี้จะทำให้ระบบการเคลื่อนที่ส่งข้อความแจ้งเตือนเกี่ยวกับตำแหน่งเอนทิตีที่เปลี่ยนไป ระบบตรวจจับการชนหมายถึงการตอบสนองเพราะมันต้องการที่จะอัพเดทดัชนีอวกาศ ในบางกรณีมันทำให้เกิดปัญหาเนื่องจากเนื้อหาของเซลล์ (รายการทั่วไปของวัตถุเอนทิตีใน C #) …

5
การเพิ่มพลังในระบบที่ใช้ส่วนประกอบ
ฉันเพิ่งเริ่มได้รับการออกแบบตามส่วนประกอบ ผมไม่ทราบว่าสิ่งที่เป็น"สิทธิ"วิธีที่จะทำเช่นนี้คือ นี่คือสถานการณ์ ผู้เล่นสามารถใส่เกราะ โล่ถูกวาดเป็นฟองรอบผู้เล่นมันมีรูปร่างการชนที่แยกจากกันและลดความเสียหายที่ผู้เล่นได้รับจากเอฟเฟกต์ในพื้นที่ การหุ้มเกราะนั้นได้รับการออกแบบในเกมที่มีส่วนประกอบเป็นอย่างไร ที่ที่ฉันสับสนคือโล่มีส่วนประกอบสามอย่างที่เกี่ยวข้อง ลดความเสียหาย / กรอง สไปรต์ Collider เพื่อทำให้ความแตกต่างของเกราะที่แย่ลงอาจมีพฤติกรรมมากขึ้นซึ่งทั้งหมดอาจเป็นส่วนประกอบ: เพิ่มสุขภาพสูงสุดของผู้เล่น สุขภาพ regen การโก่งกระสุน ฯลฯ ฉันคิดอย่างนี้ไหม โล่ควรเป็นเพียงองค์ประกอบที่ยอดเยี่ยมหรือไม่ ฉันคิดว่านี่เป็นคำตอบที่ผิด ดังนั้นหากคุณคิดว่านี่เป็นวิธีที่จะไปกรุณาอธิบาย โล่ควรเป็นนิติบุคคลของตัวเองที่ติดตามตำแหน่งของผู้เล่นหรือไม่? นั่นอาจทำให้ยากต่อการใช้การกรองความเสียหาย นอกจากนี้ยังทำให้เส้นแบ่งระหว่างส่วนประกอบที่แนบกับเอนทิตี โล่ควรเป็นส่วนประกอบที่มีส่วนประกอบอื่นหรือไม่? ฉันไม่เคยเห็นหรือได้ยินอะไรแบบนี้ แต่อาจเป็นเรื่องปกติและฉันก็ยังไม่ลึกพอ โล่ควรเป็นชุดของส่วนประกอบที่เพิ่มเข้ากับเครื่องเล่นหรือไม่ อาจเป็นไปได้ที่จะมีองค์ประกอบพิเศษในการจัดการอื่น ๆ เช่นพวกเขาสามารถลบออกเป็นกลุ่ม (ทิ้งไว้เบื้องหลังองค์ประกอบการลดความเสียหายโดยไม่ตั้งใจตอนนี้น่าสนุก) มีอะไรอีกที่เห็นได้ชัดสำหรับคนที่มีประสบการณ์ด้านส่วนประกอบมากกว่าใช่ไหม

4
ระดับที่เหมาะสมของความละเอียดสำหรับสถาปัตยกรรมที่ใช้ส่วนประกอบคืออะไร?
ฉันทำงานกับเกมที่มีสถาปัตยกรรมเป็นส่วนประกอบ Entityเป็นเจ้าของชุดของComponentกรณีแต่ละที่มีชุดของSlotกรณีที่ในการจัดเก็บส่งและรับค่า ฟังก์ชั่นจากโรงงานเช่นPlayerผลิตเอนทิตีด้วยส่วนประกอบที่จำเป็นและการเชื่อมต่อสล็อต ฉันกำลังพยายามหาระดับที่ดีที่สุดของส่วนประกอบสำหรับส่วนประกอบ ยกตัวอย่างเช่นในขณะนี้Position, VelocityและAccelerationมีทุกองค์ประกอบที่แยกจากกันเชื่อมต่อในชุด VelocityและAccelerationได้อย่างง่ายดายเขียนใหม่เข้าไปในเครื่องแบบDeltaส่วนประกอบหรือPosition, VelocityและAccelerationสามารถนำมารวมกันควบคู่ไปกับชิ้นส่วนเช่นFrictionและGravityเป็นเสาหินPhysicsส่วนประกอบ องค์ประกอบควรมีความรับผิดชอบที่น้อยที่สุดเท่าที่จะเป็นไปได้ (ในราคาที่มากจากการเชื่อมต่อระหว่างกัน) หรือส่วนประกอบที่เกี่ยวข้องควรรวมเข้าด้วยกันเป็นเสาหิน (ในราคาที่ยืดหยุ่น) ฉันเอนไปหาอดีต แต่ฉันสามารถใช้ความคิดเห็นที่สอง

6
มีการออกแบบอะไรบ้างสำหรับระบบเอนทิตีที่อิงส่วนประกอบที่ใช้งานง่าย แต่ยังยืดหยุ่นได้
ฉันได้รับความสนใจในระบบเอนทิตีที่อิงองค์ประกอบอยู่พักหนึ่งแล้วอ่านบทความที่นับไม่ถ้วนในเกม (เกม InsomiacมาตรฐานEvolve Your Hierarchy , T-Machine , Chronoclast ... เพื่อชื่อไม่กี่คน) พวกเขาดูเหมือนจะมีโครงสร้างด้านนอกของสิ่งที่ชอบ: Entity e = Entity.Create(); e.AddComponent(RenderComponent, ...); //do lots of stuff e.GetComponent<PositionComponent>(...).SetPos(4, 5, 6); และถ้าคุณนำความคิดของข้อมูลที่ใช้ร่วมกัน (นี่คือการออกแบบที่ดีที่สุดที่ฉันเคยเห็นมาในแง่ของการไม่ทำซ้ำข้อมูลทุกที่) e.GetProperty<string>("Name").Value = "blah"; ใช่มันมีประสิทธิภาพมาก อย่างไรก็ตามการอ่านหรือเขียนนั้นไม่ใช่วิธีที่ง่ายที่สุด มันรู้สึกว่าเป็น clunky และทำงานกับคุณ โดยส่วนตัวฉันต้องการทำสิ่งที่ชอบ: e.SetPosition(4, 5, 6); e.Name = "Blah"; แม้ว่าแน่นอนว่าหนทางเดียวที่จะได้รับการออกแบบนั้นกลับมาอยู่ในเอนทิตี -> NPC-> ศัตรู -> FlyingEnemy-> FlyingEnemy- ด้วย …

5
การปรับปรุงฟังก์ชั่น O (N ^ 2) (เอนทิตีทั้งหมดทำซ้ำมากกว่าเอนทิตีอื่น ๆ ทั้งหมด)
พื้นหลังเล็กน้อยฉันเขียนโค้ดเกมวิวัฒนาการกับเพื่อนใน C ++ โดยใช้ ENTT สำหรับระบบเอนทิตี สิ่งมีชีวิตที่เดินไปรอบ ๆ ในแผนที่ 2 มิติกินสีเขียวหรือสิ่งมีชีวิตอื่นทำซ้ำและคุณสมบัติของพวกมันกลายพันธุ์ นอกจากนี้ประสิทธิภาพก็ดี (60fps ไม่มีปัญหา) เมื่อเกมทำงานแบบเรียลไทม์ แต่ฉันต้องการที่จะเพิ่มความเร็วอย่างมีนัยสำคัญโดยไม่ต้องรอ 4h เพื่อดูการเปลี่ยนแปลงที่สำคัญ ดังนั้นฉันต้องการได้เร็วที่สุด ฉันกำลังดิ้นรนเพื่อหาวิธีที่มีประสิทธิภาพสำหรับสิ่งมีชีวิตในการค้นหาอาหารของพวกเขา สิ่งมีชีวิตแต่ละคนควรจะมองหาอาหารที่ดีที่สุดที่อยู่ใกล้พวกเขา หากต้องการกินสิ่งมีชีวิตที่อยู่ในภาพควรจะมองไปรอบ ๆ ตัวเองในรัศมี 149.64 (ระยะการมองของมัน) และตัดสินว่าควรกินอาหารชนิดใดซึ่งขึ้นอยู่กับโภชนาการระยะทางและประเภท (เนื้อสัตว์หรือพืช) . ฟังก์ชั่นที่รับผิดชอบในการค้นหาสิ่งมีชีวิตทุกชนิดของพวกเขาคือการกินอาหารประมาณ 70% ของเวลาใช้งาน ทำให้การเขียนง่ายขึ้นในขณะนี้มันจะเป็นดังนี้: for (creature : all_creatures) { for (food : all_entities_with_food_value) { // if the food is within the …

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

2
ฉันจะเข้าถึงส่วนประกอบใน C ++ Entity-Component-Systems ของฉันได้อย่างไร
(สิ่งที่ฉันอธิบายจะขึ้นอยู่กับการออกแบบนี้: กรอบงานระบบเอนทิตี้คืออะไรเลื่อนลงมาแล้วคุณจะพบมัน) ฉันมีปัญหาในการสร้างระบบเอนทิตีส่วนประกอบใน C ++ ฉันมีชั้นองค์ประกอบของฉัน: class Component { /* ... */ }; ซึ่งจริงๆแล้วเป็นอินเทอร์เฟซสำหรับส่วนประกอบอื่น ๆ ที่จะสร้าง ดังนั้นเพื่อสร้างองค์ประกอบที่กำหนดเองฉันเพิ่งใช้อินเทอร์เฟซและเพิ่มข้อมูลที่จะใช้ในเกม: class SampleComponent : public Component { int foo, float bar ... }; ส่วนประกอบเหล่านี้จะถูกเก็บไว้ในคลาส Entity ซึ่งให้ ID ที่เป็นเอกลักษณ์แต่ละ Entity: class Entity { int ID; std::unordered_map<string, Component*> components; string getName(); /* ... */ }; มีการเพิ่มส่วนประกอบลงในเอนทิตีโดยการใส่ชื่อส่วนประกอบ …

3
วิธีการรหัส UI / HUD ในระบบองค์กร?
ฉันคิดว่าฉันมีความคิดเกี่ยวกับระบบ Entity ที่ได้แรงบันดาลใจจาก Adam Martin (เครื่องจักร) ฉันต้องการเริ่มใช้สิ่งนี้สำหรับโครงการต่อไปของฉัน ฉันรู้พื้นฐานของเอนทิตีส่วนประกอบและระบบแล้ว ปัญหาของฉันคือวิธีจัดการ UI / HUD ตัวอย่างเช่นหน้าต่างภารกิจหน้าต่างทักษะหน้าต่างข้อมูลตัวละคร ฯลฯ คุณจัดการกับกิจกรรม UI ได้อย่างไร (เช่นการกดปุ่ม) สิ่งเหล่านี้เป็นสิ่งที่ไม่จำเป็นต้องประมวลผลทุกเฟรม ขณะนี้ฉันกำลังใช้ MVC เป็น code UI แต่ฉันไม่คิดว่าจะเข้ากันได้กับ Entity System ฉันได้อ่านแล้วว่าเอนทิตีระบบฝังอยู่บน OOP ที่ใหญ่กว่า ฉันไม่รู้ว่า UI อยู่นอก ES หรือไม่ ฉันจะเข้าใกล้คนนี้ได้อย่างไร

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