コンポーネントベースのエンティティアーキテクチャにおける「システム」の役割は何ですか?


177

私はエンティティのコンポーネントとシステムについて多くのことを読んでおり、エンティティが単なるIDであるという考えは非常に興味深いと考えてきました。

しかし、これがコンポーネントの側面やシステムの側面でどのように完全に機能するのかわかりません。コンポーネントは、関連するシステムによって管理される単なるデータオブジェクトです。衝突システムは、空間データ構造とともにいくつかのBoundsComponentを使用して、衝突が発生したかどうかを判断します。

これまでのところすべて良いですが、複数のシステムが同じコンポーネントにアクセスする必要がある場合はどうでしょうか?データはどこに保存する必要がありますか?入力システムはエンティティBoundsComponentを変更できますが、物理システムはいくつかのレンダリングシステムと同じコンポーネントにアクセスする必要があります。

また、エンティティはどのように構築されますか?私がこれまで読んだことのある利点の1つは、エンティティ構築の柔軟性です。システムは本質的にコンポーネントに結び付けられていますか?新しいコンポーネントを導入したい場合、新しいシステムを導入したり、既存のシステムを変更したりする必要がありますか?

私がよく読んだもう1つのことは、エンティティの「タイプ」は、そのコンポーネントが持っているものによって推測されるということです。エンティティが単なるIDである場合、ロボットエンティティを移動またはレンダリングし、何らかのシステムで変更する必要があることをどのようにして知ることができますか?

長い投稿で申し訳ありません(少なくとも、私の携帯電話の画面からはそう思われます)!

回答:


336

エンティティコンポーネントシステムを表現および実装する方法は多数ありますが、ここでは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エンティティに含まれるコンポーネントを定義するキーのアイデアでこれに答えると思います。キーがロックに合うので知っています。

ふう!それは長い投稿でした!(または、少なくとも私の大きなモニターからはそう思われます。)


23
この重要なアナロジーは、現在、アイデア全体を理解するのに非常に役立ちます。素晴らしいアイデア!最後の段落で笑:)
bio595

16
+1これまでに見たエンティティーコンポーネントシステムの最大かつ最良の説明のために。:O!
knight666

7
私から-1-これは悪いアプローチではなく、アプローチとして描かれているからです。しかし、コンポーネントとサービスが分離されていないシステム(Unityなど)が多くあり、システムが処理するエンティティを簡単に知る方法があります(エンティティの作成時にそれらを追加するだけです)。
キロタン

37
@Kylotan「これらのシステムがどのエンティティを処理するかを認識する方法を設定する方法は複数ありますが、1つの方法はを使用することlongです。」さらに、私は通常、役に立たない回答(ホバーテキストとして)と言う)。彼らが取り組んでいるトピックの100%をカバーしていないすべての答えに対してそれをした場合、投票に多くの時間を費やすと思います。
マイケルハウス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.