Deteksi dan respons tabrakan dalam Sistem Entitas


12

Lebih menyenangkan dengan ES ...

Saat ini, saya memiliki beberapa sistem:

  • Renderer (Atribut yang dapat diurai, Ubah atribut)
  • Gerakan (Atribut bergerak, Atribut transformasi, Atribut yang dapat di render [untuk kotak pembatas, dll])
  • Input (atribut InputReceiver)
  • dll.

Saya menambahkan deteksi tabrakan. Pikiran pertama saya adalah menambahkan sistem baru yang melakukan tabrakan. Masuk akal bagi saya untuk menjaga ini terisolasi dari Motionsistem karena tidak semua hal yang bergerak atau animasi harus berpartisipasi dalam deteksi tabrakan - kamera, kabut, dll - tetapi tampaknya Collisiondan Motionsaling tergantung.

Ketika Motionmemindahkan suatu entitas, transformasi perlu divalidasi dengan Collision, dan gerakan itu dibatalkan, atau disesuaikan (memantul, berhenti di dinding, dll.).

Alternatifnya adalah membuat atribut Collidable yang mempertahankan referensi ke objek collision - kd-tree, octree, dll. Yang dibagikan di antara entitas yang dapat saling bertabrakan. The MotionSistem kemudian akan memeriksa atribut itu, dan menggunakannya untuk memeriksa atau menyesuaikan gerakan.

Dari perspektif kode, itu solusi yang dapat diterima. Namun, dari sudut pandang arsitektur ECS, tampaknya mendorong logika ke dalam Motionsistem yang tidak berlaku untuk semua entitas yang memiliki Movableatribut.

Saya juga bisa menyimpan vektor gerak pada Movableatribut, dan memiliki Collidersistem menyesuaikan Transformsesuai kebutuhan, tapi itu akan melibatkan duplikasi fungsi antara Motiondan Collider, atau panggilan balik dari Colliderke Motiondengan beberapa data tentang lokasi tabrakan dan permukaan data untuk bounce / refleksi, dll .

Ini mungkin berada di bawah judul "hack kasus khusus" tetapi saya ingin mendapatkan beberapa masukan dari mereka yang pernah menangani ini sebelumnya tanpa membuat satu ton kode kasus tepi.

Pertanyaan Apa cara yang baik untuk menghindari kopling ketat antara gerak dan sistem tabrakan ketika tampaknya mereka membutuhkan pengetahuan satu sama lain?


1
Apa pertanyaannya?
jcora

@Bane apa tempat yang baik untuk menempatkan logika deteksi tabrakan, menjaga gerakan collision + terpisah mungkin, dan menjaga saling ketergantungan antar sistem seminimal mungkin. Posting saya agak melantur ...
3Dave

1
Bagus, sekarang masukkan itu dalam pertanyaan Anda, cetak tebal . :)
jcora

Jawaban:


7

Anda terlalu memikirkannya. Di mesin saya, yang juga menggunakan sistem entitas-komponen, setiap GameObjectdapat memiliki pointer ke a ModuleCollision.

Apa yang terjadi ketika game diperbarui:

  • Adegan memperbarui semua objek yang dimilikinya. Ini memanggil Updatefungsi untuk masing-masing GameObject.
  • Di dalam Updatefungsi, masing-masing GameObject hanya memperbarui kecepatan dan arahnya, bukan posisinya.
  • GameObjectunggah posisi saat ini, kecepatan, dan arah ke posisinya ModuleCollision, jika ada.
  • Adegan melakukan pemeriksaan tabrakan atas ModuleCollisiondasar.
  • Adegan memanggil UpdatePostfungsi masing-masing GameObject. Jika objek memiliki modul tumbukan, ia mengambil posisi, kecepatan, dan arah yang diperbarui dari modul tumbukan. Posisi diperbarui dengan kecepatan dan arah.
  • The GameObjectmembangun sebuah matriks 3x3 akhir dari posisinya dan pos.

Ya, ada beberapa duplikasi negara, tapi tidak apa-apa. Melakukan penanganan tabrakan pada a ModuleCollisionadalah cara terbaik untuk melakukannya, karena jika tidak, Anda harus memeriksa masing GameObject- masing untuk mengetahui apakah ia memiliki ModuleCollisionpegangan.


2
Jadi, daripada khawatir tentang posisi mundur jika terjadi tabrakan, Anda memisahkan kecepatan / akselerasi dari terjemahan, mengubah yang didasarkan pada tabrakan yang terdeteksi, dan kemudian perubahan tersebut disebarkan dalam pembaruan khusus kedua dalam bingkai yang sama? Tampaknya cukup bersih. Terima kasih.
3Dave

3

Saya akan melakukannya seperti ini ...

Memiliki tiga sistem:

  1. Sistem pergerakan
  2. Sistem akselerasi
  3. Sistem tabrakan

Sistem pergerakan menerapkan kecepatan pada posisi. Sistem akselerasi memberikan gaya pada kecepatan. Sistem tumbukan mendeteksi tumbukan dan menerapkan gaya ke arah yang benar, atau, jika Anda ingin tumbukan kasar, secara langsung mengubah kecepatan.

Misalnya, Anda dapat menghitung sudut antara tabrakan menggunakan atan2 , dan kemudian menggunakannya untuk menerapkan gaya / kecepatan yang benar pada benda.

Suruh sistem deteksi tabrakan menyiarkan pesan jika diperlukan juga.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.