タグ付けされた質問 「entity-system」

ゲームオブジェクト(エンティティ)がコンポーネントから構成され、システムによって操作されるプログラミングパラダイム。各エンティティは、特定のコンポーネントを指すIDです。

4
ソースのようなエンジンはエンティティをどのように処理しますか?
ソースエンジン(およびその前任者、goldsrc、quake's)では、ゲームオブジェクトは2つのタイプ(ワールドとエンティティ)に分かれています。世界はマップジオメトリで、エンティティはプレーヤー、パーティクル、サウンド、スコアなどです(ソースエンジンの場合)。 すべてのエンティティには、そのエンティティのすべてのロジックを実行するthink関数があります。 したがって、処理する必要のあるものがすべてthink関数を含む基本クラスからのものである場合、ゲームエンジンはリストにすべてを格納し、すべてのフレームでループしてその関数を呼び出すことができます。 一見すると、このアイデアは合理的ですが、ゲームに多くのエンティティがある場合は、リソースが多すぎる可能性があります。 では、Sourceなどのエンジンは、ゲームオブジェクトの処理(処理、更新、描画など)をどのように行うのでしょうか。

1
Entity System Architecture with Task Based Parallelismの使用
バックグラウンド 私は自分の暇な時間にマルチスレッドゲームエンジンの作成に取り組んでおり、エンティティシステムを既に作成したものに組み込むための最良の方法を決定しようとしています。これまでのところ、私は自分のエンジンの出発点としてIntelからのこの記事を使用しました。これまでのところ、タスクを使用して通常のゲームループを実装しており、システムやエンティティシステム、あるいはその両方の組み込みに取り掛かっています。私は過去にアルテミスに似たものを使ったことがありますが、並行性が私を捨ててしまいます。 Intelの記事では、エンティティデータのコピーが複数あり、各エンティティに加えられた変更が完全な更新の最後に内部的に配布されることが推奨されているようです。つまり、レンダリングは常に1フレーム遅れますが、得られるべきパフォーマンス上の利点を考えると、許容できる妥協案のようです。ただし、Artemisのようなエンティティシステムの場合、システムごとに各エンティティが複製されるため、各コンポーネントも複製する必要があります。これは実行可能ですが、多くのメモリを消費するように思えます。これを議論するインテルのドキュメントの部分は主に2.2と3.2.2です。探しているアーキテクチャを統合するための適切なリファレンスが見つかるかどうかを確認するためにいくつか検索を行いましたが、まだ有用なものを見つけることができていません。 注:このプロジェクトではC ++ 11を使用していますが、私が求めていることのほとんどは言語にとらわれないものでなければならないことを想像しています。 可能な解決策 EntitiesとEntityAttributesの作成と管理に使用されるグローバルEntityManagerを用意します。更新フェーズでのみ読み取りアクセスを許可し、すべての変更をスレッドごとにキューに保存します。すべてのタスクが完了すると、キューが結合され、それぞれの変更が適用されます。これは、同じフィールドへの複数の書き込みで問題が発生する可能性がありますが、それを整理する優先システムまたはタイムスタンプがあると確信しています。変更の配布段階でシステムにエンティティへの変更をかなり自然に通知できるため、これは私にとっては良いアプローチのようです。 質問 それが理にかなっているかどうかを確認するために私の解決策についてのフィードバックを探しています。私は嘘をついてマルチスレッドの専門家であると主張することはありません。私はこれを主に練習のために行っています。複数のシステムが複数の値を読み書きしている私のソリューションからいくつかの複雑な混乱が発生することを予測できます。私が言及した変更キューも、PODを使用していないときに起こりうる変更を簡単に通知できるようにフォーマットするのが難しい場合があります。 フィードバック/アドバイスは大歓迎です!ありがとう! リンク集 http://software.intel.com/en-us/articles/designing-the-framework-of-a-parallel-game-engine http://gamadu.com/artemis/ http://www.gamedev.net/topic/560083-rendering-in-a-task-based-multithreaded-environment/(この投稿の投稿には記載されていませんが、同様のソリューションが記載されています)

2
エンティティシステム内でのエンティティの割り当て
エンティティシステム内でエンティティをどのように割り当て/類似する必要があるのか​​、よくわかりません。私にはさまざまなオプションがありますが、それらのほとんどには短所が関連付けられているようです。すべての場合において、エンティティはID(整数)に似ており、おそらくラッパークラスが関連付けられています。このラッパークラスには、エンティティにコンポーネントを追加/削除するメソッドがあります。 オプションについて言及する前に、ここに私のエンティティシステムの基本構造を示します。 エンティティ ゲーム内のオブジェクトを説明するオブジェクト 成分 エンティティのデータを格納するために使用されます システム 特定のコンポーネントを持つエンティティが含まれています 特定のコンポーネントでエンティティを更新するために使用されます 世界 エンティティシステムのエンティティとシステムが含まれています エンティティを作成/破棄し、システムをそこに追加/削除できます 私が考えた私の選択肢は次のとおりです: オプション1: エンティティラッパークラスを保存せず、次のID /削除されたIDのみを保存します。つまり、エンティティは次のように値で返されます。 Entity entity = world.createEntity(); これは、この設計にいくつかの欠陥があることを除いて、ententxによく似ています。 短所 エンティティラッパークラスが重複している可能性があります(コピークターを実装する必要があり、システムにエンティティを含める必要があるため) エンティティが破棄された場合、重複するエンティティラッパークラスの値は更新されません オプション2: エンティティラッパークラスをオブジェクトプール内に保存します。つまり、エンティティは次のようにポインタ/参照によって返されます。 Entity& e = world.createEntity(); 短所 重複するエンティティがある場合、エンティティが破棄されると、同じエンティティオブジェクトが別のエンティティの割り当てに再利用されることがあります。 オプション3: 未加工のIDを使用し、ラッパーエンティティクラスを忘れます。これの落とし穴は、それに必要な構文だと思います。これを実装するのが最も簡単で簡単に思えるので、これを行うことを考えています。構文が原因で、私はそれについてかなり確信が持てません。 つまり、このデザインでコンポーネントを追加するには、次のようになります。 Entity e = world.createEntity(); world.addComponent<Position>(e, 0, 3); これに付け加えて: Entity e = world.createEntity(); e.addComponent<Position>(0, 3); 短所 …

5
IDを使用して異なる場所で同じゲームエンティティの複数の参照を管理する
私は同様のトピックについて素晴らしい質問を見てきましたが、この特定の方法に対処するものはありませんでした: [XNA Game Studio]ゲームにゲームエンティティの複数のコレクションがあり、多くのエンティティが複数のリストに属している場合、エンティティが破棄されるたびに追跡し、所属するリストから削除する方法を検討しています。 多くの潜在的なメソッドがずさんで複雑なように見えますが、以前に見た方法では、ゲームエンティティの複数のコレクションを使用する代わりに、ゲームエンティティIDのコレクションを使用する方法を思い出しました。これらのIDは、中央の「データベース」(おそらくハッシュテーブル)を介してゲームエンティティにマッピングされます。 したがって、コードの一部がゲームエンティティのメンバーにアクセスする必要がある場合は常に、まずデータベース内にあるかどうかを確認します。そうでない場合は、それに応じて反応します。 これは健全なアプローチですか?オブジェクトにアクセスするたびにルックアップのコストがかかるトレードオフで、複数のリストを格納することのリスク/手間の多くが排除されるようです。

3
ECSを使用する場合のユーザーフレンドリーなスクリプト?
私は現在、ゲーム開発に戻るために小さな趣味のプロジェクトを作成しており、ECS(エンティティコンポーネントシステム)を使用してエンティティを構造化することにしました。ECSのこの実装は、次のように構成されています。 エンティティ:私の場合int、コンポーネントのリストへのキーとして使用されるのは一意の識別子です。 コンポーネント:データのみを保持します。たとえば、Positionコンポーネントはxand y座標をMovement保持し、コンポーネントはspeedand direction変数を保持します。 システム:コンポーネントを処理します。たとえば、PositionおよびMovementコンポーネントを取得し、speedおよびdirectionを位置xとy座標に追加します。 これは問題なく動作しますが、今度はゲームにスクリプト言語の形式でスクリプトを実装したいと思います。以前のプロジェクトでは、ゲームオブジェクトのOOP実装を使用しました。つまり、スクリプトは非常に単純明快でした。たとえば、単純なスクリプトは次のようになります。 function start() local future = entity:moveTo(pos1) wait(future) local response = entity:showDialog(dialog1) if wait(response) == 1 then local itemStack = entity:getInventory():removeItemByName("apple", 1) world:getPlayer():getInventory():addItemStack(itemStack) else entity:setBehavior(world:getPlayer(), BEHAVIOR_HOSTILE) end end ただし、ECSを使用する場合、エンティティ自体にはmoveToorのような関数はありませんgetInventory。代わりに、ECSスタイルで記述された上記のスクリプトは次のようになります。 function start() local movement = world:getComponent(MOVEMENT, entity) movement:moveTo(pos1) local position = world:getComponent(POSITION, entity) local future …


4
エンティティコンポーネントシステム-ゲームの進行
私はゲーム開発(プログラミングではなく)に非常に慣れていないので、世界間の通信を処理するための最良の方法を理解しようとしています。私が言っているのはこれです: 私はエンティティコンポーネントシステム(ECS)と、人々がさまざまなワールド/スペース(http://gamedevelopment.tutsplus.com/tutorials/spaces-useful-game-object-containers--gamedev-14091)の使用をどのように提案するかについて読んでいますゲームのサブセクション。たとえば、HUD、インベントリ、または戦闘/移動は、それぞれ異なるワールド/スペースを取得します(それらは異なるグラフィックスと基礎となるロジックを持っているためです)。 しかし、たとえば戦闘中など、別のスペース/ワールドによってヘルスが処理される場合、インベントリまたはHUDがプレーヤーのヘルスをどのように知っているのかと思いました。 これは、ゲームの進行状況にも適用されます。たとえば、NPCとのダイアログ(ダイアログはポップアップ画面であるため別のスペースになります)ですが、ダイアログで行われた選択(または状態)を他のスペース/ワールドにどのように伝えますか。 。または基本的に、さまざまなスペース/世界でのゲームの進行に影響を与える他のタイプのイベント(健康、マナ、クエスト、ダイアログ、戦闘、インベントリ、hudなど) この種の設計をどのように処理するでしょうか?このような情報をすべて保持する(実装の)シングルトンオブジェクトが必要ですか?それは奇妙なことです。それは、components2回物事をしているように感じる(プログラミングのメインDRYに反対する)このシングルトンオブジェクトに各変更を伝える必要があるからです... 私はここでデザインの点で途方に暮れています。 ---編集--- だから私はコメントで提案された他のいくつかの投稿を読んで、可能性についての一般的な考えを得ましたが、それらのそれぞれには、それらを正しくないようにする1つの大きな欠点があるようです。これらの欠点を解決する詳細を監督している可能性が非常に高いため、自由に修正してください。概要と、いくつかの質問に対する回答を示します。 スペース間でデータを「共有」する3つの主要なオプションが表示されます。ほとんどの投稿はシステム間でのデータ共有に関するものですが、システム間でのデータ共有にも同じことが当てはまると思います。 1.クエリ 例:HUDワールドがプレーヤーの現在のヘルスを知る必要がある場合、HUDワールドは別のワールドを照会して現在のヘルスを要求できます。 欠点:世界はお互いを知る必要があります。これは依存関係の大きな問題であり、デカップリングに反対しています。 2:ダイレクトメッセージング(同期および非同期) 例:戦闘中にプレーヤーのヘルスが変更された場合、この変更について知る必要がある他の世界にメッセージ(同期と非同期、必要なものは何でも)を送信できます。 欠点:それでもデカップリングの問題:世界はお互いについて知る必要があります。 3:間接メッセージング(同期および非同期) <-最適なオプション 例:戦闘中にプレーヤーのヘルスが変化した場合、プレーヤーはメッセージ(同期と非同期、必要なものは何でも)を一般的なメッセージハブに送信できます。この変更について知る必要がある他の世界/システムは、特定のメッセージチャネルにサブスクライブされ、メッセージを読み取ります。 利点:完全に分離され、管理と拡張が容易です。 欠点/不明確:メッセージチャネルは、メッセージを削除する必要があることをいつ知っていますか?または、サブスクライブしているシステムがメッセージを(それ自体のみ)既読としてマークし、新しいメッセージを待つ->しばらくするとメッセージボックスが巨大になる。ワールド/システムはどのように順序を処理しますか?たとえば、フレーム中:HUDがすでにヘルスメッセージをポーリングし、その後ヘルスが変化した場合、次のフレームでHUDが更新されます。一部のアプリケーションでは、これは正しい方法ではない場合があります。 Q:1つのゲームオブジェクトが複数のスペースに存在できます 私は組み込みスペース(ワールドと呼ばれます)に付属しているArtemis ECSフレームワークを使用しています。各エンティティ(およびそれとともにコンポーネントの形式のデータ)はワールド上に作成されるため、ワールド間で共有することはできません。

2
コンポーネントベースのエンティティシステムのメッセージ処理に関するヒント
コンポーネントベースのエンティティシステムを実装しようとしていますが、メッセージングの処理方法について少し混乱しています。システムをテストできるように、解決したい2つの問題があります。以下は私がこれまでに持っているコードです、 Entityクラス: class Entity{ public: Entity(unsigned int id): id_(id) {}; void handleMessage(BaseMessage &message){ for(auto element: components_){ element.second->handleMessage(message); } } template<class T> void attachComponent(T *component){ //Consider making safer in case someone tries to attach same component type twice components_[typeid(T).hash_code()] = component; } template<class T> void detachComponent(void){ components_.erase(typeid(T).hash_code()); } template<class T> T* …

1
エンティティシステムのアニメーション状態の抽象化
私は最近、エンティティシステムパラダイムを使用してゲームエンジンの設計を開始しました。つまり、コンポーネントの集約としてエンティティを持ち、実際のゲームを実装するシステムがあります。私はさまざまな面で困難を経験してきましたが、最も気になるのは、さまざまなコンポーネント/システムの抽象化/モジュール性です。具体的には、Playerいくつかのアニメーション状態があるとしましょう。Walking、Sleeping、Jumping、のいずれかのタイプとOpponent、エンティティは、例えば、同様にいくつか(必ずしも同じ)状態を有します。Walking、Hidingなど 各エンティティタイプのさまざまな(アニメーション)状態を処理するようにエンジンを設計するにはどうすればよいですか?エンティティタイプごとに異なるアニメーションシステムが必要ですか?正しいエンティティをレンダリングするためにアニメーションシステムに信号を送るフラグを使用する必要がありますか?また、さまざまなポーズに「ハードコードされた」列挙型の使用を回避できますか?スクリプトシステムがおそらく役立つことがわかりますが、もっと簡単な解決策があるとほぼ確信しています。

1
コンポーネントプールの問題の処理-エンティティサブシステム
アーキテクチャの説明 エンティティシステムを作成(設計)していて、多くの問題に遭遇しました。私はそれを可能な限りデータ指向で効率的に保つようにしています。私のコンポーネントは、同種のプールに割り当てられたPOD構造(正確にはバイトの配列)です。各プールにはComponentDescriptorがあります。コンポーネント名、フィールドタイプ、フィールド名のみが含まれています。 エンティティは、コンポーネントの配列へのポインタにすぎません(アドレスはエンティティIDのように機能します)。EntityPrototypeには、エンティティ名とコンポーネント名の配列が含まれています。最後に、コンポーネントプールで機能するサブシステム(システムまたはプロセッサ)。 実際の問題 問題は、いくつかのコンポーネントが他のコンポーネントに依存していることです(モデル、スプライト、PhysicalBody、アニメーションは変換コンポーネントに依存します)。これは、コンポーネントの処理に関して多くの問題を引き起こします。 For example, lets define some entities using [S]prite, [P]hysicalBody and [H]ealth: Tank: Transform, Sprite, PhysicalBody BgTree: Transform, Sprite House: Transform, Sprite, Health and create 4 Tanks, 5 BgTrees and 2 Houses and my pools will look like: TTTTTTTTTTT // Transform pool SSSSSSSSSSS // Sprite pool …

2
高速な距離ベースのエンティティ検索のためのデータ構造(またはアルゴリズム)
たとえば、ゲームには100人の敵(さまざまなチーム)が走り回っていて、AIは近くのエンティティを調べて攻撃対象を確認したいと考えています。それらのエンティティを整理して、各敵がそれ自体と他のすべてのエンティティとの間の距離を計算する必要がないようにするための迅速な方法は何ですか? 手短に言えば、AIエンティティが「近くにいるのは誰ですか?」という質問にすばやく答える方法は何ですか。

3
コンポーネントベースのシステムにおけるエンティティの状態の役割は?
最近では、コンポーネントベースのエンティティシステムが大流行しています。誰もが自分たちが進むべき道であることに同意しているようですが、そのようなシステムを確実に実装している人は誰もいません。エンティティの状態(左折、立っている、ジャンプなど)がCBSでどのような役割を果たしているのでしょうか。それらはコントローラーのように機能しますか(つまり、イベントを処理し、それらのイベントに基づいてエンティティーの属性を変更します)? たとえば、状態がエンティティにクリップなしモードに入ることを要求する場合はどうでしょうか?それが入るときに、その状態は、エンティティのCollisionComponentをnullポインタまたは何かに設定する必要がありますか?(次に、終了時に、状態はエンティティのCollisionComponentを以前の状態に復元する必要があります。) また、エンティティの状態を別の状態に変更するのは、現在の状態の仕事だと思いますよね?

2
サーバー上のすべてのNPC / AIオブジェクトを管理する方法は?
私は単純なMMOを作成しており、現在、複数のユーザーがお互いを確認し、一緒に移動できるようにサーバークライアントアーキテクチャを配置しています。今度は敵を追加します。 世界で管理する必要のある何百ものNPCオブジェクトを最適に処理する方法を論じている記事へのリンクがあるかどうか疑問に思っていました。私はいくつかの検索を行ったが、これが通常どのように行われるかについての多くの情報を見つけることができなかった。 私が考えることができる実装を構造化する2つの方法: すべてのインスタンス化されたNPCオブジェクトをリストに保持し、NPCスレッドがそれらを順番にループして、それぞれに処理および必要なアクションを実行する必要があるロジックがあるかどうかを確認します。このデザインのパフォーマンスが十分かどうかはわかりませんか? イベントベースのシステム。AI / Logicを処理するメソッドをNPCクラスで作成し、関連するイベントが通知されたときにこのメソッドが呼び出されるようにします(相互作用しないAI機能のタイマーで(ワンダリングなど)、またはパケットから外部にイベントを通知します)。ハンドラー(近くに移動するプレーヤー、または範囲内で攻撃するプレーヤー)。 これらのアプローチのどちらが正しい方法ですか?これを行う他の方法は何ですか?

2
エンティティシステムについて予約しますか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 2年前休業。 エンティティシステムの機能に本当に興味があります。この本で良い本を検索しようとしていますが、失敗しました。 私はこのパラダイムの学習に夢中になりたくないので、本は大きな助けになります。誰かが良い本を推薦できますか? また、この言語は不可知論ですか?または、このパラダイムを実装するのに苦労する言語がありますか(例:Objective-C)? ありがとう。

4
コンポーネントの動作をオーバーライドする
コンポーネントベースのエンティティシステムで動作のオーバーライドを実装する方法を考えていました。具体的な例として、エンティティには、ダメージ、回復、殺されるなどのヒースコンポーネントがあります。エンティティには、キャラクターが受けるダメージの量を制限する鎧コンポーネントもあります。 これまでにコンポーネントベースのシステムでこのような動作を実装したことはありますか? どうやってやったの? 誰もこれまでにこれをしたことがないのなら、なぜそうだと思いますか? コンポーネントの動作をオーバーライドすることに特に問題があることはありますか? 以下は私がそれがうまくいくと想像する方法の大まかなスケッチです。エンティティのコンポーネントは順序付けられています。最前線のユーザーは、最初にインターフェースのサービスを受ける機会を得ます。それがどのように行われるかについては詳しく説明しません。悪意のあるdynamic_castsを使用すると仮定します(実際は使用しませんが、RTTIがなくても最終的な効果は同じです)。 class IHealth { public: float get_health( void ) const = 0; void do_damage( float amount ) = 0; }; class Health : public Component, public IHealth { public: void do_damage( float amount ) { m_damage -= amount; } private: float m_health; }; class Armor …

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