エンティティコンポーネントシステムを表現および実装する方法は多数ありますが、ここでは1つの方法について説明します。エンティティ/コンポーネント/システムアーキテクチャの具体的な定義はないため、これは実装の1つにすぎません。
エンティティ/コンポーネント/システムアーキテクチャの類似性を紹介します。エンティティをキーのように考えてみましょう。
エンティティ
キーにも歯があります(濃い青)。エンティティキーの歯は、それを構成するコンポーネントです。同じ歯を持っている場合でも、IDによってエンティティを区別できます。それでは、キーは何に適合するのでしょうか?ロック。ロックは私たちのシステムです。たとえば、移動システム。
システム
ロックは、キーに位置と速度の両方の歯がある場合にのみ機能します。このシステムは、位置と速度を持つエンティティのみを処理します。これらのシステムが処理するエンティティを認識する方法を設定する方法は複数ありますが、1つの方法はを使用することlong
です。各ビットはコンポーネントタイプ用に予約されています。この例では、64ビット長ではなく4ビットタイプを想定します。この例のエンティティには、使用可能なすべてのコンポーネントが含まれます。だからそれはキーになります1111
。次に、システムはを持っているエンティティを探してい11--
ます。(-
代表者は気にしない、なぜなら、スプライトや健康があれば動きは気にしないから)。簡単なAND
操作でエンティティを確認できます。したがって、エンティティはifに一致します((1111 & 1100) == 1100)
。もしあなたを失ったら、ビット単位の操作についてもっと調べてください。
ご覧のとおり、システムは外部リソースにアクセスできます。時間、グラフィックス、サウンドなどにアクセスできます。これらは、一度に1つのキーを取得し、データを処理する小さなプロセッサです。移動システムが速度、デルタ時間、および位置を取得することがわかります。その後、いくつかの計算を行い、結果を元の位置に保存します。
エンティティキーは非常に簡単に生成できます。自由に追加または削除できます。エンティティは気にしません。コンポーネントをグループ化して保持する方法にすぎません。コンポーネントには相互依存関係はありません。コンポーネントが相互作用するのに最も近いのは、システムがコンポーネントを操作し、移動の例のように、あるコンポーネントからのデータを使用して別のコンポーネントを更新するときです。
アイデアを固めるのに役立つ別のシステムを見てみましょう。
これが描画システムです。一致するコンポーネントを探します1-1-
。このエンティティは次の理由で一致し((1111 & 1010) == 1010)
ます。さらに、エンティティスプライトをその位置に描画することにより、このシステムが画面に情報を出力することがわかります。
OK、もう1つ。別のエンティティを見て、それが今までの例にどのように適合するかを見てみましょう。
ご覧のとおり、このエンティティにはコンポーネントが少なくなっています。持っているコンポーネントを見ると、岩のような静的なアイテムのように見えます。位置とスプライトだけがあります。それは動きませんし、健康の変化による影響も受けません。このエンティティは、1010のキーを生成します。このエンティティで動作するシステムは何ですか?確認しよう:
私たちの運動システムに対して:
((1010 & 1100) != 1100)
いいえ。このエンティティには必要なコンポーネントがないため、移動システムはこのエンティティを気にしないようです。
描画システムに対して:
((1010 & 1010) == 1010)
ねえ、それはマッチです。このエンティティは、描画システムによって操作されます。描画システムは、定義された位置にスプライトを描画します。
コンポーネントを取得してそれらを操作する別のシステムを追加するのがどれほど簡単かを確認できれば幸いです。あなたの質問に対処したことを確認させてください:
複数のシステムが同じコンポーネントにアクセスする必要がある場合はどうなりますか?データはどこに保存する必要がありますか?
通常、システムは次々に動作します。要件に一致するすべてのエンティティを処理し、次のシステムも同様に処理します。データはエンティティと共に存在します。システムには何も保存されるべきではありません。それは単にロックが回されるだけで、キーは情報が留まり、ロックからロックへ移動する場所です。
エンティティはどのように構築されますか?システムは本質的にコンポーネントに結び付けられていますか?新しいコンポーネントを導入したい場合、新しいシステムを導入したり、既存のシステムを変更したりする必要がありますか?
エンティティはコンポーネントの単なる袋です。一意のIDとコンポーネントのリストがあります。システムは、上記の方法でのみコンポーネントに結び付けられます。コンポーネントを操作するシステムなしでコンポーネントを使用できますが、それは無意味です。同様に、エンティティにないコンポーネントを探しているシステムを持つことができます。ロックと一致するエンティティが作成されるのを待っているだけなので、それほど意味がありません。ですから、はい、新しいコンポーネントを導入する場合、そのコンポーネントを利用するシステムを作りたいでしょう。それ以外の場合は、存在しないロックのキーに歯を追加するだけです。
エンティティが単なるIDである場合、ロボットエンティティを移動またはレンダリングし、何らかのシステムで変更する必要があることをどのようにして知ることができますか?
long
エンティティに含まれるコンポーネントを定義するキーのアイデアでこれに答えると思います。キーがロックに合うので知っています。
ふう!それは長い投稿でした!(または、少なくとも私の大きなモニターからはそう思われます。)