ESでもっと楽しく...
現在、私はいくつかのシステムを持っています:
- レンダラー(レンダリング可能属性、変換属性)
- モーション(移動可能な属性、変換属性、レンダリング可能な属性[境界ボックスなど])
- 入力(InputReceiver属性)
- 等
衝突検出を追加しています。最初に考えたのは、衝突を実行する新しいシステムを追加することでした。これは、から分離され、これを維持するために私には理にかなってMotion
カメラ等、霧、 - -移動またはが必ずしもアニメーション化されていることではないすべてのものは、衝突検出に関与するのでシステムが、と思われるCollision
とはMotion
相互に依存しています。
Motion
エンティティを移動する場合、変換はで検証する必要がCollision
あり、移動はキャンセルまたは調整(バウンス、壁での停止など)する必要があります。
別の方法として、衝突オブジェクトへの参照を保持するCollidable属性を作成する方法があります-kd-tree、octreeなどは、互いに衝突する可能性のあるエンティティ間で共有されます。Motion
システムは、その属性をチェックし、確認したり、動きを調整するためにそれを使用します。
コードの観点から見ると、これは許容できる解決策です。ただし、ECSアーキテクチャの観点からMotion
は、Movable
属性を持つすべてのエンティティに適用されないロジックをシステムにプッシュしているようです。
私はまた、動きベクトルを格納することができMovable
、属性、および持っているCollider
システムは調整しTransform
、必要に応じて、それは間の機能の重複を伴うだろうMotion
とCollider
、またはからのコールバックCollider
へのMotion
バウンス/反射などのための衝突場所と表面データに関するいくつかのデータを持ちます。
これは「特別なケースハック」という見出しに該当する可能性がありますが、大量のエッジケースコードを作成せずにこれを処理したことがある人から入力を受け取りたいと思います。
質問 モーションシステムと衝突システムがお互いの知識を必要とするように思われる場合、それらのシステム間の密結合を回避する良い方法は何ですか?