エンジンのエンティティコンポーネントシステムを設計する際に、特定のタイプのコンポーネントを格納および取得する方法に少し問題がありました。
最初に、この質問で使用する少しの用語を明確にします。
- 「コンポーネント」を、特定のシステムに関連するデータを格納するデータ構造と呼びます。
- 私は、「システム」をメソッドとデータ構造の集合体と呼び、コンポーネントを使用してユーザーとのゲームの状態/インターフェースを更新します。
- 「エンティティ」は基本的に、特定のコンポーネントを取得し、ゲームロジックでそれらのデータを変更するために使用される単なるIDです。
各システムは、コンポーネントのタイプ(例:Physics-> PhysicsComponent、AI-> AIComponent、Rendering-> RenderingComponent)の(IDマップ)配列を所有しているため、データを効率的に反復できます。
ただし、すべてのコンポーネントが特定のシステムによって所有されているわけではありません。たとえば、Transformコンポーネントはオブジェクトの位置、回転、スケールを保存します。物理学、AI、レンダリングなどの多くのシステムで使用されているため、エンティティの最も重要な部分の1つです(Unityは必須にします)。
これはほとんど私が直面している問題です。Transformは他の多くのシステムで使用されているので、コンポーネントごとに使用するものを取得するにはどうすればよいですか?考えられる解決策の1つは、各コンポーネントに独自のエンティティIDを格納させることです。このようなコンポーネントを取得するのは簡単ですが、それほど効率的ではありません。また、他のコンポーネントを認識していない、分離された独立したデータのバンドルとしてのコンポーネントの概念に反します。
この問題を解決する適切な方法はありますか?Transformもコンポーネントにする必要がありますか?