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?