問題タブ [entity-system]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
8 に答える
161545 参照

architecture - コンポーネントベースのゲームエンジン設計

私はゲーム エンジンの設計 (特に 2D ゲーム エンジンに焦点を当てていますが、3D ゲームにも適用可能) に注目しており、その方法に関する情報に興味があります。最近では、多くのエンジンが、従来の深いオブジェクト階層ではなく、コンポーネント ベースの設計に移行していると聞きました。

これらの種類の設計がどのように実装されることが多いかについての情報への良いリンクを知っていますか? 私はあなたの階層を進化させたのを見てきましたが、詳細な情報をもっと多く見つけることはできません (ほとんどは「階層ではなくコンポーネントを使用する」と言っているようですが、考え方を変えるには少し努力が必要であることがわかりました) 2 つのモデルの間)。

これに関する優れたリンクや情報、さらには本をいただければ幸いです。ただし、ここでのリンクと詳細な回答が優先されます。

0 投票する
4 に答える
10252 参照

oop - コンポーネントベースのゲームエンジンでの通信

私が作成している 2D ゲーム (Android 用) では、GameObject が複数の GameComponent オブジェクトを保持するコンポーネント ベースのシステムを使用しています。GameComponents には、入力コンポーネント、レンダリング コンポーネント、弾丸放出コンポーネントなどがあります。現在、GameComponents はそれらを所有し、それを変更できるオブジェクトへの参照を持っていますが、GameObject 自体はコンポーネントのリストを持っているだけで、オブジェクトが更新されたときに更新できる限り、コンポーネントが何であるかは気にしません。

コンポーネントには、GameObject が知る必要のある情報が含まれている場合があります。たとえば、衝突検出の場合、GameObject はそれ自体を衝突検出サブシステムに登録して、別のオブジェクトと衝突したときに通知を受けます。衝突検出サブシステムは、オブジェクトのバウンディング ボックスを認識する必要があります。x と y をオブジェクトに直接格納します (複数のコンポーネントで使用されるため) が、幅と高さは、オブジェクトのビットマップを保持するレンダリング コンポーネントにしかわかりません。その情報を取得するメソッド getBoundingBox または getWidth を GameObject に入れたいと思います。または、一般的に、コンポーネントからオブジェクトに情報を送信したいと考えています。しかし、私の現在の設計では、GameObject はリストにある特定のコンポーネントを認識していません。

この問題を解決するには、いくつかの方法が考えられます。

  1. コンポーネントの完全に一般的なリストを用意する代わりに、GameObject にいくつかの重要なコンポーネント用の特定のフィールドを持たせることができます。たとえば、renderingComponent というメンバー変数を持つことができます。使用するオブジェクトの幅を取得する必要があるときはいつでもrenderingComponent.getWidth()。このソリューションでは、コンポーネントの一般的なリストを引き続き使用できますが、一部のコンポーネントの扱いが異なります。より多くのコンポーネントを照会する必要があるため、いくつかの例外的なフィールドが発生することになるのではないかと心配しています。一部のオブジェクトには、レンダリング コンポーネントさえありません。

  2. 必要な情報を GameObject のメンバーとして保持しますが、コンポーネントがそれを更新できるようにします。したがって、オブジェクトの幅と高さはデフォルトで 0 または -1 ですが、レンダリング コンポーネントは更新ループでそれらを正しい値に設定できます。これはハックのように感じられ、すべてのオブジェクトがそれらを必要としない場合でも、利便性のために多くのものを GameObject クラスにプッシュすることになる可能性があります。

  3. 照会できる情報の種類を示すインターフェースをコンポーネントに実装させます。たとえば、レンダリング コンポーネントは、getWidth や getHeight などのメソッドを含む HasSize インターフェイスを実装します。GameObject が幅を必要とする場合、そのコンポーネントをループして HasSize インターフェイスを実装しているかどうかを確認します ( Java またはC# でinstanceofキーワードを使用)。isこれはより一般的な解決策のように思えますが、欠点の 1 つは、コンポーネントの検索に時間がかかる場合があることです (ただし、ほとんどのオブジェクトには 3 つまたは 4 つのコンポーネントしかありません)。

この質問は特定の問題に関するものではありません。それは私のデザインで頻繁に出てきて、それを処理する最善の方法は何だろうと考えていました。これはゲームであるため、パフォーマンスは多少重要ですが、オブジェクトあたりのコンポーネントの数は一般的に少なくなります (最大 8)。

ショートバージョン

ゲームのコンポーネント ベースのシステムで、一般的なデザインを維持しながら、コンポーネントからオブジェクトに情報を渡す最良の方法は何ですか?

0 投票する
5 に答える
18687 参照

c++ - ゲーム内のエンティティの処理

小さな演習として、エンティティ(移動、基本的なAIなど)を処理するだけの非常に小さくてシンプルなゲームエンジンを作成しようとしています。

そのため、ゲームがすべてのエンティティの更新をどのように処理するかを考えようとしていますが、少し混乱しています(おそらく間違った方法で行っているためです)

そこで、この質問をここに投稿して、私の現在の考え方を示し、誰かが私にそれを行うためのより良い方法を提案できるかどうかを確認することにしました。

現在、必要な他のクラス(CWindowクラス、CEntityManagerクラスなど)へのポインターを受け取るCEngineクラスがあります。

擬似コードでは次のようなゲームループがあります(CEngineクラス内)

私のCEntityManagerクラスは次のようになりました。

そして、私のCEntityクラスは次のようになりました。

その後、例えば敵のクラスを作成し、それにスプライトシートや独自の機能などを与えます。

例えば:

これらはすべて、画面にスプライトを描画するだけで問題なく機能しました。

しかし、あるエンティティには存在するが別のエンティティには存在しない関数を使用するという問題に直面しました。

上記の擬似コードの例では、do_ai_stuff(); およびhandle_input();

私のゲームループからわかるように、EntityManager-> draw();への呼び出しがあります。これはentityVectorを繰り返し処理し、draw()を呼び出しました。各エンティティの関数-すべてのエンティティにdraw()があるため、これは問題なく機能しました。働き。

しかし、入力を処理する必要があるのがプレーヤーエンティティである場合はどうなるでしょうか?それはどのように機能しますか?

試したことはありませんが、敵のようなエンティティにはhandle_input()関数がないため、draw()関数のようにループすることはできないと思います。

次のように、ifステートメントを使用してentityTypeをチェックできます。

しかし、私は人々が通常どのようにこのようなものを書くのかわからないので、それを行うための最良の方法がわかりません。

私はここにたくさん書いたが、具体的な質問はしなかったので、ここで探しているものを明確にします。

  • コードのレイアウト/設計方法は問題ありませんか?それは実用的ですか?
  • 自分のエンティティを更新し、他のエンティティにはない関数を呼び出すためのより効率的な方法はありますか?
  • 列挙型を使用してエンティティタイプを追跡することは、エンティティを識別するための良い方法ですか?
0 投票する
3 に答える
1531 参照

c++ - コンポーネントベースのゲーム エンティティと型チェック

コンポーネント ベースのエンティティ システムを使用するゲームを作成しています。私が実装している最初の 2 つのコンポーネントは、EntityRepresentation と EntityState です。表現はアニメーションを保持し、状態はエンティティがゲーム イベントにどのように反応するかを決定します (EntityStates の例: 立っている、ジャンプしている、攻撃している、死んでいる、落下している)。

EntityRepresnetation は、エンティティの EntityState に応じて、画面に描画するアニメーションを決定します。エンティティが「ジャンプ」状態の場合、対応するアニメーションが再生されます。(EntityRepresentation::changeAnimation() 関数を参照してください。)

これが大まかなクラスの書き方です...

現在のアプローチで本当に気に入らないことがあります... >:( EntityState::Id 部分。現在、EntityRepresentation は、保持する各アニメーションを特定の EntityState::Id にマップします。ID はすべてのクラスに固有です。これは EntityState から派生します (インスタンスではなく、クラスに固有です). これらの ID は基本的に、クラスのコンストラクターで手動で記述しなければならない文字列です。ゲームをスクリプト可能にします (Python)。

ID に関するこの問題を軽減する方法について、アドバイスをいただけないでしょうか。ID も使用するコンポーネント ベースのシステムの実装をゲームでたくさん見てきましたが、それでも好きではありません。それは私を間違った方法でこするだけです。

カプセル化を維持しながら、EntityRepresentation が EntityState の型を知る必要がないように、設計変更を提案できるかもしれません。

0 投票する
1 に答える
2688 参照

c++ - C++ のエンティティ システム

私は最近、エンティティ システム アーキテクチャを発見しました。C++ でそれを実行するのは困難であり、実装を理解することもできません。

エンティティ システムの見方:

コンポーネント: 属性、set および get を持つクラス。

  1. スプライト
  2. 物理体
  3. 宇宙船
  4. ...

System : コンポーネントのリストを持つクラス。

  1. リスト項目
  2. エンティティマネージャー
  3. レンダラー
  4. 入力
  5. カメラ
  6. ...

Entity : コンポーネントのリストを持つ単なる空のクラス。

私がやったこと:

現在、私はそれを可能にするプログラムを持っています:

EntitySystem を正しく理解していれば、各システムには、それが動作するコンポーネントの独自のリストがあります。(コンポーネントのリストまたはエンティティのリスト、それが問題です)

(高速デバッグのためだけにコードを .h に入れました ^^)

問題

X コンポーネントのリストを持つシステムに「T」コンポーネントを追加したい

私が試したこと:

しかし、私はそのようなものが欲しい:

私の System クラスは抽象的です。私のシステムの子クラスには、このリストが独自のタイプである必要があります。

解決 :

System クラスにテンプレート クラスを持たせようとしたので、次のようにしました: class Renderer: System

しかし、私の SystemManager はこのコードが好きではありません: std::vector<System> systems.

T タイプのシステム クラス:

SystemManager コード:

これにより、SystemManager に次のエラーが表示され ます

この問題の解決策はありましたか? 私のEntitySystemアプローチは良かったですか?

ありがとう!

0 投票する
1 に答える
3225 参照

c++ - C++ ゲーム エンジンのコンポジット、コンポーネント、およびエンティティ

私はゲームを開発する学校のプロジェクトに取り組んでいます。私たちは、私たちが持っているチームの1つによって作られたエンジンを使用しています. エンジンのビルドアップは私には不明確であり、アンチパターンのようです. しかし、誰も私にデザインの選択を明確にすることはできないようです. エンジンは「コンポーネントベース」の設計を使用することになっていますが、私にはわかりません。以下は、Component、Composite、および Entity クラスの両方のコードです。簡単に言えば、私の質問は次のとおりです。このコードは有効な設計パターンを使用していますか、それとも「設計パターンを実装する」ためだけに複雑すぎて、アンチパターンを引き起こしていますか?

コンポーネント.cpp:

エンティティ.cpp

コンポジット.cpp

次のコードは Player.cpp で、複合型とエンティティの両方をハイブリッド型のオブジェクトとして使用しています (ロジックがよくわかりません)。

Player.cpp

これがコンポーネントベースの設計であるとはまったく思いません。エンティティを削除せず、コンポジットとコンポーネントのみを使用してください。コンポーネントの基本クラスを空にして直接使用してはいけませんか? Rigidbody データのデータ構造を保持する「Rigidbody」と呼ばれるコンポーネントと、完全に仮想的なコンポーネントの基本クラスをオーバーライドするいくつかの関数のように?

0 投票する
1 に答える
902 参照

oop - エンティティ コンポーネント プログラミング専用に作成された言語はありますか?

関数型プログラミング (LISP、Haskell など) や OOP プログラミング (Java、C#、Ruby、Python など) 用の言語があることは知っていますが、エンティティ コンポーネント プログラミングの概念に基づいて作成された言語はありますか?

0 投票する
1 に答える
2851 参照

java - システム全体のlibgdxでステージ、グループ、アクターを使用してゲームデザインにエンティティコンポーネントシステムを使用する方法は?

エンティティ コンポーネント システムは、ゲーム開発におけるオブジェクト指向プログラミングで発生するスケールの問題を解決することができます。ECS に関していくつか質問があります。

概要を説明すると、いくつかのコンポーネント (データを持つ) を含むエンティティと、歩行ロジック、戦闘ロジックなどのロジックを持つシステムがあります。したがって、どのゲームでも、敵はエンティティであり、ヒーローは独自のシステムを持つエンティティなどです。各プレイヤー/敵はエンティティになります。

  1. 最初は、ステージ、グループ、およびアクターを使用していました。ステージは、階層を使用してアクターにイベントを渡し、イベントに基づいてそれを処理していました。私はエンティティを持っているので、何が私の新しいアクターになりますか? すべてのエンティティがアクターになりますか? はいの場合、各行為で、すべてのコンポーネントの更新関数を呼び出し、描画関数で描画しますよね?
  2. エンティティ コンポーネント システムはアクターのみに使用されますか、それともステージ、グループ、カメラにも使用する必要がありますか? すべての人に使用する必要がある場合、誰かがその方法を理解するのを助けることができますか?

オブジェクト指向では、グループにアクターを追加し、適切なタスクを実行するイベントに基づいてアクターにイベントをステージ送信するので簡単です。ECS で考えるのは初めてなので、何かが足りない場合は申し訳ありません。コードを書き始めましたが、システム全体を考えているうちに混乱してしまいました。役者の仕事の仕方はわかったけど、それをグループや舞台、カメラなどでどうやって働かせるか。

0 投票する
2 に答える
1398 参照

entity - アルテミス エンティティ システム フレームワーク

私は Artemis Entity Systems フレームワークを初めて使用します。特定のコンポーネントを含むすべてのエンティティを取得する方法があるかどうかを知りたいですか? (あるはずなのですが、見つけられませんでした。)

たとえば、 を持つすべてのエンティティを見つけて、その中EnemyComponentにあるエンティティと衝突するかどうかを確認したいとBulletComponentします。これどうやってするの?