การตรวจจับการชนกันและการตอบสนองใน Entity System


12

สนุกยิ่งขึ้นด้วย ES ...

ปัจจุบันฉันมีระบบน้อย:

  • Renderer (แอตทริบิวต์ Renderable, แอตทริบิวต์การแปลง)
  • การเคลื่อนไหว (แอตทริบิวต์ที่เคลื่อนย้ายได้, การแปลงแอตทริบิวต์, แอตทริบิวต์ที่แสดงผลได้ [สำหรับกล่องขอบ ฯลฯ ])
  • อินพุต (แอตทริบิวต์ InputReceiver)
  • เป็นต้น

ฉันกำลังเพิ่มการตรวจจับการชน ความคิดแรกของฉันคือการเพิ่มระบบใหม่ที่ดำเนินการชนกัน มันสมเหตุสมผลสำหรับฉันที่จะแยกสิ่งนี้ออกจากMotionระบบเนื่องจากไม่ใช่ทุกสิ่งที่เคลื่อนไหวหรือเป็นภาพเคลื่อนไหวจำเป็นต้องมีส่วนร่วมในการตรวจจับการชนกัน - กล้องหมอก ฯลฯ - แต่ดูเหมือนว่าCollisionและMotionมันพึ่งพาซึ่งกันและกัน

เมื่อไหร่ Motionย้ายเอนทิตีการแปลงจะต้องได้รับการตรวจสอบความถูกต้องCollisionและการเคลื่อนไหวจะถูกยกเลิกหรือปรับ (การกระดอนหยุดที่ผนัง ฯลฯ )

อีกทางเลือกหนึ่งคือการสร้างแอตทริบิวต์ Collidable ที่รักษาการอ้างอิงไปยังวัตถุการชน - kd-tree, octree เป็นต้นที่ใช้ร่วมกันระหว่างเอนทิตีที่สามารถชนกัน Motionระบบแล้วจะตรวจสอบสำหรับแอตทริบิวต์นั้นและใช้มันในการตรวจสอบหรือปรับการเคลื่อนไหว

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

ฉันยังสามารถจัดเก็บเวคเตอร์แบบเคลื่อนไหวในMovableแอตทริบิวต์และColliderปรับระบบTransformตามต้องการ แต่จะเกี่ยวข้องกับการทำซ้ำการทำงานระหว่างMotionและColliderหรือการโทรกลับจากColliderไปยังMotionด้วยข้อมูลบางอย่างเกี่ยวกับตำแหน่งการชนและข้อมูลพื้นผิวสำหรับการตีกลับ / การสะท้อน ฯลฯ .

สิ่งนี้อาจตกอยู่ภายใต้หัวข้อของ "การแฮ็กกรณีพิเศษ" แต่ฉันต้องการรับข้อมูลบางอย่างจากผู้ที่เคยจัดการสิ่งนี้มาก่อนโดยไม่ต้องสร้างโค้ดเคสแบบขอบจำนวนมาก

คำถาม เป็นวิธีที่ดีในการหลีกเลี่ยงการเชื่อมต่ออย่างแน่นหนาระหว่างระบบการเคลื่อนที่และการชนเมื่อดูเหมือนว่าพวกเขาต้องการความรู้ซึ่งกันและกัน


1
คำถามคืออะไร?
jcora

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

1
ยิ่งขณะนี้ใส่ที่ในคำถามของคุณเป็นตัวหนา :)
jcora

คำตอบ:


7

คุณคิดมาก ในเครื่องมือของฉันซึ่งยังใช้ระบบนิติบุคคลองค์ประกอบทุกสามารถมีตัวชี้ไปที่GameObjectModuleCollision

จะเกิดอะไรขึ้นเมื่ออัพเดตเกม:

  • ฉากอัปเดตวัตถุทั้งหมดที่เก็บไว้ มันเรียกฟังก์ชั่นสำหรับแต่ละUpdateGameObject
  • ภายในUpdateฟังก์ชั่นแต่ละตัวGameObject จะอัพเดตความเร็วและทิศทางไม่ใช่ตำแหน่ง
  • GameObjectอัปโหลดตำแหน่งปัจจุบันความเร็วและทิศทางไปยังตำแหน่งModuleCollisionนั้นหากมี
  • ฉากทำการตรวจสอบการชนกันของภาพบนModuleCollisionพื้นฐาน
  • ฉากเรียกUpdatePostฟังก์ชั่นในแต่ละGameObjectฟังก์ชั่นในแต่ละหากวัตถุนั้นมีโมดูลการชนกันวัตถุนั้นจะดึงตำแหน่งความเร็วและทิศทางที่ได้รับการอัปเดตจากโมดูลการชนกัน ตำแหน่งจะถูกอัพเดตด้วยความเร็วและทิศทาง
  • GameObjectสร้างเมทริกซ์ 3x3 สุดท้ายออกจากตำแหน่งและส่วนหัวของมัน

ใช่มีการซ้ำซ้อนของรัฐ แต่ก็ไม่เป็นไร การจัดการการชนบน a ModuleCollisionเป็นวิธีที่ดีที่สุดในการทำเช่นนั้นเพราะมิฉะนั้นคุณจะต้องตรวจสอบแต่ละครั้งGameObjectเพื่อดูว่ามีModuleCollisionด้ามจับหรือไม่


2
ดังนั้นแทนที่จะกังวลเกี่ยวกับตำแหน่งย้อนรอยในกรณีที่มีการชนกันคุณกำลังแยกความเร็ว / ความเร่งจากการแปลเปลี่ยนสิ่งเหล่านั้นตามการชนใด ๆ ที่ตรวจพบจากนั้นการเปลี่ยนแปลงเหล่านั้นจะถูกเผยแพร่ในการอัพเดทพิเศษครั้งที่สองภายในเฟรมเดียวกัน ดูเหมือนจะค่อนข้างสะอาด ขอบคุณ
3Dave

3

ฉันจะทำเช่นนี้ ...

มีสามระบบ:

  1. ระบบการเคลื่อนไหว
  2. ระบบเร่งความเร็ว
  3. ระบบการชน

ระบบการเคลื่อนที่จะใช้ความเร็วกับตำแหน่ง ระบบเร่งความเร็วจะใช้แรงกับความเร็ว ระบบการชนกันจะตรวจจับการชนและใช้แรงในทิศทางที่ถูกต้องหรือหากคุณต้องการการชนแบบหยาบ

ตัวอย่างเช่นคุณสามารถคำนวณมุมระหว่างการชนโดยใช้atan2แล้วใช้มันเพื่อใช้แรง / ความเร็วของร่างกายที่ถูกต้อง

ให้ระบบกระจายการตรวจสอบการชนกันของข้อมูลส่งข้อความถ้าจำเป็นด้วย

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