ระดับที่เหมาะสมของความละเอียดสำหรับสถาปัตยกรรมที่ใช้ส่วนประกอบคืออะไร?


26

ฉันทำงานกับเกมที่มีสถาปัตยกรรมเป็นส่วนประกอบ Entityเป็นเจ้าของชุดของComponentกรณีแต่ละที่มีชุดของSlotกรณีที่ในการจัดเก็บส่งและรับค่า ฟังก์ชั่นจากโรงงานเช่นPlayerผลิตเอนทิตีด้วยส่วนประกอบที่จำเป็นและการเชื่อมต่อสล็อต

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

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


คำถามที่คล้ายกัน: gamedev.stackexchange.com/questions/4914/...
Den

คุณจะใช้เครื่องมือฟิสิกส์ของคุณเองหรือรวมเข้ากับที่มีอยู่หรือไม่
Den

@Den: ฉันเขียนรหัสฟิสิกส์แต่มันไม่ได้เป็นเครื่องมือใด ๆ เพียงแค่จลนศาสตร์ 2D ทางโลก
Jon Purdy

คำตอบ:


14

มีเส้นแบ่งระหว่างความละเอียดที่สมบูรณ์นำไปสู่การไม่มีการสูญเสียรหัสหรือสถานะคล้ายหยด

เห็นได้ชัดว่าสิ่งต่าง ๆ อาจมีPositionแต่ก็ไม่จำเป็นต้องมีพลวัต (เหตุใดจึงมีVelocityและAcceleration?) อย่างไรก็ตามสิ่งที่มี a Velocityจะเป็นวัตถุเคลื่อนที่ดังนั้นจึงเหมาะสมที่จะAccelerationจัดกลุ่ม

คุณจะมีกรณีที่ต้องการให้vและaต้องการ แต่คุณไม่ต้องการการจำลองทางฟิสิกส์สำหรับพวกเขาหรือไม่? ในทำนองเดียวกันจะมีจุดGravityถ้าพวกเขาไม่ใช่วัตถุฟิสิกส์?

tl; dr กลุ่มสิ่งที่ทำให้รู้สึก


1
ฟังดูยุติธรรม ระบบรวมศูนย์อำนาจของฉันมีน้อยมาก: ถ้าEntityมีPositionและบางส่วนประกอบที่ทำให้ที่Positionมีส่วนร่วมในทางฟิสิกส์แล้วEntityเป็นพฤตินัยทางกายภาพ ฉันคิดว่าสิ่งที่ฉันจะทำคือเพียงเพิ่มส่วนประกอบบางอย่างสำหรับการจัดกลุ่มเชิงตรรกะและเก็บส่วนประกอบพื้นฐานทั้งหมดไว้ในความรับผิดชอบเดียว ดังนั้นการเพิ่มการพูดการMovableไปยังEntityจะมีผลเช่นเดียวกับการเพิ่มPosition, และVelocity Acceleration
Jon Purdy

6

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

ดังนั้นสำหรับตัวอย่างที่เร่งรีบคุณมีเกม เกมแบ่งออกเป็น Environment + State สภาพแวดล้อมแยกเป็น StaticWorld + MovingStuff รัฐแบ่งออกเป็น AIControlled + PlayerControlled ความคิดขั้นต้นของความเสียหายแบ่งออกเป็น TakesDamage + GivesDamage

และอื่น ๆ

เหมือนคำแนะนำทั่วไปในการ "สร้างเกมไม่ใช่เครื่องมือ!" สำหรับผู้ปฏิบัติงานใหม่ฉันแนะนำ "สร้างเกมไม่ใช่ระบบส่วนประกอบที่ซับซ้อน!" เพราะมีเพียงประสบการณ์ส่วนตัวกับเกมที่กำลังเล่นอยู่เท่านั้นที่คุณจะรู้ว่าระบบคอมโพเนนต์ที่ซับซ้อนถูกเรียกใช้สำหรับงานในอนาคตหรือไม่


ฉันไม่ใช่นักพัฒนาใหม่ หากฉันมีองค์ประกอบตามแนวคิดไม่ใช่พฤติกรรม (เช่นจากบนลงล่างและจากล่างขึ้นบน) สถาปัตยกรรมของฉันจะไม่เปราะและซับซ้อนกว่านี้หรือไม่ ฉันสามารถใช้พฤติกรรมใดก็ได้ที่ฉันต้องการจากองค์ประกอบขนาดเล็ก แต่ฉันไม่สามารถรับพฤติกรรมที่ต้องการได้จากพฤติกรรมที่รวมไว้ล่วงหน้า ไม่ต้องพูดถึงว่าฉันไม่สามารถคาดเดาทุกสิ่งที่ฉันต้องการได้แม้ในบริบทของเกมเดียว
จอน Purdy

ข้อเสียเปรียบจากล่างขึ้นบนคือการสื่อสารระหว่างส่วนประกอบกลายเป็นปัญหาและผู้คนมีแนวโน้มที่จะเริ่มต้นด้วยวิธีที่เล็กเกินไปในระดับของสิ่งที่พวกเขากำลังสร้างแบบจำลอง ฉันส่วนใหญ่พยายามที่จะหลีกเลี่ยง super-micro "xyz เป็นองค์ประกอบ" "การหมุนเป็นองค์ประกอบ" "rgb เป็นองค์ประกอบ" ระดับสำหรับคนที่ไม่มีประสบการณ์
Patrick Hughes

ยุติธรรมพอสมควร ฉันแค่ต้องการให้แน่ใจว่าฉันเข้าใจคุณถูกต้อง ด้วยระบบสล็อตที่ฉันมีมันง่ายและมีประสิทธิภาพสำหรับส่วนประกอบในการสื่อสารดังนั้นฉันจึงไม่เห็นข้อเสียใด ๆ ในระดับ "super-micro" ฉันไม่ได้ตั้งใจจะดัดแปลงสิ่งนี้ให้เป็นเอ็นจิ้นเดี่ยว แต่ถ้าทำฉันก็สามารถแนะนำ abstractions เช่นกลุ่มส่วนประกอบที่ฉันพูดถึงในความคิดเห็นของฉันในคำตอบของ The Communist Duck
Jon Purdy

4

ฉันเดาว่าจะรวมองค์ประกอบที่จะมีปฏิสัมพันธ์มากมาย ในกรณีของคุณฉันจะรักษาตำแหน่งไว้ในองค์ประกอบเดียวและให้ความเร็วและความเร่งรวมเข้าด้วยกันในองค์ประกอบฟิสิกส์

แต่มันก็ขึ้นอยู่กับว่าเกมของคุณมีลักษณะเป็นอย่างไร


2
ปัญหาเกี่ยวกับการรวมส่วนประกอบที่มีปฏิสัมพันธ์จำนวนมากคือบางครั้งส่วนอื่นไม่จำเป็น
The Duck Communist

4

ฉันรู้ว่านี่เป็นคำถามเก่า แต่อาจมีบางคนอาจพบว่าคำตอบนี้มีประโยชน์

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

ตัวอย่างเช่นคุณอาจมีMovementSystemที่ปรับปรุงกิจการของขึ้นอยู่กับพวกเขาPosition Velocityนี่อาจเป็นสิ่งง่าย ๆ ในเกม แต่สำหรับผู้เล่นและศัตรูคุณอาจต้องการการเคลื่อนไหวที่ได้ซึ่งมีการประมวลผลในAcceleration AcceleratedMovementSystemแต่สำหรับอุปสรรคFrictionที่คุณอาจต้องการ ภูมิประเทศอาจมีแรงเสียดทาน แต่มันจะไม่ได้มีองค์ประกอบความเร็ว แต่เกี่ยวกับGravityอะไร เพียงเพิ่มผู้เล่นศัตรูและอุปสรรคและสร้าง a GravitySystemเพื่อดำเนินการ

บรรทัดล่างคือว่ายิ่งหลุดพ้นของคุณComponentsมีมากขึ้นขยายจะได้รับเมื่อใช้EntitiesSystems

แก้ไข: ทำให้ข้อความสั่งสุดท้ายชัดเจนขึ้น

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


ฉันอ่านโพสต์บล็อกเมื่อเร็ว ๆ นี้ซึ่งพูดแบบนี้:

"ถ้าคุณมีข้อมูลที่สามารถจัดกลุ่มด้วย 2 ส่วนประกอบที่แตกต่างกันได้ดีที่สุดคือสร้างส่วนประกอบที่สามด้วยข้อมูลนั้น"

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