タグ付けされた質問 「component-based」

コンポーネントベースの設計は、ビジネスオブジェクトとゲームオブジェクトの複数の論理属性を、特定のタスク専用の小さなコンポーネントに分離することに依存しています。ゲームオブジェクトは通常、「実世界」のオブジェクトの属性と動作を一緒に集約し、特殊なオブジェクトが一般的なオブジェクトから継承できるようにモデル化されますが、コンポーネントベースのデザインは、継承ではなく構成に依存します。

1
コンポーネント/エンティティベースの設計+ビヘイビアツリー=>統合方法
私の現在のプロジェクトでは、コンポーネント/エンティティベースのシステムを実装しました。基本的に、このかなり未定義の領域にあるベストプラクティスのほとんどに従っています。 だから私は(少し拡張された)エンティティを取得しました。これは基本的にintID、人間が読める名前、std::mapコンポーネントのa 、およびlong存在するコンポーネントを示すために使用される「タイプインジケーター」です(私はenumすべてのコンポーネントに対して2の累乗を持っています)タイプと、コンポーネントがエンティティに追加されるときはいつでも、ビット単位の演算によってその長さを自動的に変更し、比較しますます。この回答を)。 次に、Componentsもあります。これもかなり単純です。コンポーネントタイプとしてのintID enum、親エンティティポインター、およびstd::mapこのコンポーネントが保持するすべてのプロパティのa です。 最後に、実際のロジック処理を処理するいくつかのシステム/マネージャー。彼らは最初に、現在処理されているエンティティに一致するlong「タイプインジケーター」があるかどうかをチェックします=そのシステムに必要なすべてのコンポーネントが存在します。次に、必要に応じていくつかのプロパティにアクセスし、それぞれのコンポーネントの関数を直接呼び出すか、メッセージディスパッチャを介してメッセージを送信します。 結論:ここまでは、かなり標準的なイベント駆動型のコンポーネント/エンティティベースのシステムとデータ駆動型のアプローチを組み合わせたものです(比較すると、コンポーネントにはハードコードされたデータ変数がなく、(一部の)コンポーネントとして一般的なマップがありますコンポーネントの/ archetypesは後で、実際のコンポーネントコードの一部ではない追加データを追加するオプションを使用してファイルから読み取られます。 次に、そのプロジェクトに(AiGameDev BTSKに基づく)動作ツリーも導入したいと思いますが、それらを既存のコンポーネントにリンクする必要があるかどうか、どのようにリンクするべきか、またはそれらのデザインを一般的に統合する方法はわかりません。 いくつかの関連するアイデア/ポイント/質問が頭に浮かびます: 私のBTはファイルから(再び)読み込まれます。現在BT Action、ツリー内のとアプリケーションの実際のコーディングとの間の接続を最適にする方法を確認するのに苦労しています。BTファイルで使用されるアクション名と実際のロジック実装への関数ポインターとの間に何らかのマップを作成する必要がありますか?それを解決するための通常のアプローチは何ですか? 私はすべての異なるEntityタイプ(つまり、ゲームロジックとAIに関連するコンポーネントの組み合わせのそれぞれについて、何度も言及した長い「タイプインジケーター」で示されるように)に対してBTを作成する必要があると思います。結果として、BT Actionアクションごとに多くのコンポーネントが関与する可能性が最も高いため、コンポーネントに実装を配置することは意味がありませんか? それで、BT Actionロジックは複数の個別のシステムに配置する必要がありますか(アイデア#1からのマップが指し示すメソッドに)。次に、システムは私のlong「タイプインジケーター」ごとにEntity、BTが現在チェックされており、特定のアクション(=システム内のメソッド)の実行が実際に許可されている(=必要なコンポーネントがある)かどうかをチェックします。しかし、そうでない場合(たとえば、BT作成者が特定の状況を見落とし、実行時に必要なコンポーネントがエンティティにアタッチされなくなる可能性があるため)、何も起こりません。 質問: そのような統合のための実証済みの概念はありますか? 上記の3つの点についてどう思いますか? コンポーネント/エンティティベースのデザイン全般に関して、他に思い浮かぶことはありますか?

2
エンティティシステムの多くの動きの原因
私はエンティティシステムのアイデアにかなり慣れていません。たくさんのものを読んだことがあります(最も便利なのは、この素晴らしいブログとこの回答)。 未定義の数のソースによってオブジェクトの位置を操作できるほど単純なものを理解するのに少し問題があります。 つまり、私にはエンティティがあり、これには位置コンポーネントがあります。次に、このエンティティに、指定された時間内に指定された距離を移動するように指示するイベントをゲームで実行します。 これらのイベントはいつでも発生する可能性があり、位置と時間の値は異なります。その結果、それらは一緒に合成されます。 従来のOOソリューションでMoveByは、距離/時間を含むある種のクラスと、ゲームオブジェクトクラス内のそれらの配列がありました。各フレームではMoveBy、すべてのを反復処理して、位置に適用します。がMoveBy終了時間に達した場合は、アレイから削除します。 エンティティシステムでは、この種の動作をどのように再現するべきかについて少し混乱しています。 一度にこれらの1つだけがあった場合、それらを一緒に合成することができる代わりに、それはかなり単純で(私は信じます)、次のようになります。 PositionComponent 含む x, y MoveByComponent 含む x, y, time Entitya PositionComponentとaの両方があるMoveByComponent MoveBySystemこれらのコンポーネントの両方を持つエンティティを探し、の値をMoveByComponentに追加しますPositionComponent。にtime到達すると、そのエンティティからコンポーネントが削除されます。 多くの移動方法で同じことをどのように行うかについて、私は少し混乱しています。 私の最初の考えは、私が持っているだろうということです: PositionComponent、MoveByComponent上記と同じ MoveByCollectionComponentMoveByComponentsの配列が含まれています MoveByCollectionSystemこれは、a PositionComponentとa を持つエンティティを探し、その内部MoveByCollectionComponentのMoveByComponentsを繰り返し、必要に応じて適用/削除します。 これはより一般的な問題だと思います。同じコンポーネントの多くがあり、それぞれに対応するシステムが動作することを望んでいるからです。私のエンティティには、コンポーネントタイプ->コンポーネントのハッシュ内にコンポーネントが含まれているため、エンティティごとに特定のタイプのコンポーネントが1つだけ存在します。 これはこれを見るのに正しい方法ですか? エンティティは常に特定のタイプのコンポーネントを1つだけ持つ必要がありますか?

2
エンティティまたはコンポーネントの状態変化
私のエンティティの状態管理を処理する方法を理解するのに問題があります。 一時停止やメニューなどのエンティティのコンポーネントシステムとして処理されないため、ゲームの状態管理に問題はありません。エンティティ/コンポーネントの状態のみ。 例としてOrcs Must Dieから描画すると、MainCharacterおよびTrapエンティティがあり、PositionComponent、RenderComponent、PhysicsComponentなどのコンポーネントしかありません。 エンティティは、更新ごとにそのコンポーネントでupdateを呼び出します。また、さまざまなイベントタイプのリスナーを備えた汎用のEventManagerもあります。 次に、トラップを配置できるようにする必要があります。最初にトラップとトラップの位置を選択し、次にトラップを配置します。 トラップを配置するときは、MainCharacterの前に表示され、別の方法でレンダリングされ、それに従って進みます。配置すると、衝突に反応し、通常の方法でレンダリングされます。 これは通常、コンポーネントベースのシステムでどのように処理されますか? (この例は具体的ですが、エンティティの状態を処理する一般的な方法を理解するのに役立ちます。)

3
コンポーネントベースの設計:オブジェクトの相互作用の処理
コンポーネントベースのデザインで、オブジェクトが他のオブジェクトに対してどのように正確に機能するかはわかりません。 Objクラスがあるとしましょう。私がやります: Obj obj; obj.add(new Position()); obj.add(new Physics()); 次に、ボールを動かすだけでなく、物理を適用する別のオブジェクトを作成するにはどうすればよいでしょうか。実装の詳細ではなく、オブジェクトの通信方法を抽象的に探しています。エンティティベースのデザインでは、次のようになります。 obj1.emitForceOn(obj2,5.0,0.0,0.0); コンポーネント駆動の設計と基本的なことを行う方法をよりよく理解するための記事や説明は、非常に役に立ちます。

3
エンティティコンポーネントシステムベースのエンジン
注:これはJavaScriptでプログラミングしていますが、ほとんどの場合、言語に依存しないはずです。 エンジンをECSベースのエンジンに変換することを考えています。 私は基本的なアイデアを得ます(注:これは間違っています、私の答えを参照してください): エンティティはゲームオブジェクトです。 コンポーネントは、エンティティに「接着」できる機能(reactToInput())または状態(position)のビットです。 システムには、管理および更新するエンティティのリストがあります。 しかし、私は実装といくつかの詳細を取得することを完全に確信していません... 質問:システムはさまざまな種類のエンティティで動作できますか?私は通常Scene、エンジンで呼び出されるクラスの例を示しますが、これもこの目的に役立ちます。シーンは、レンダリング、更新、レンダリング(ライト)に影響を与える可能性のあるすべてのオブジェクトのコンテナであり、将来的には2DSoundEmitterオブジェクトも含まれる可能性があります。それは高レベルのインターフェースを持っているので、ユーザーは自分が使用しているオブジェクトのタイプscene.add()や、そのようなすべてのものについて心配する必要はありません。 私はそれがSceneシステムかもしれないことを理解しています。エンティティを取り込んで格納し、更新メソッドを呼び出して、状態を変更することもできます。しかし、問題があります。上で説明したように、にはさまざまなタイプのオブジェクトをScene供給することができます。たとえば、シーンにレンダリング可能なオブジェクト(「ドローアブル」)とライトの両方が含まれている状況ではどうすればよいですか?相互作用する前にエンティティを型チェックする必要がありますか?または、さらに低いレベルで解決する必要があります。任意のオブジェクトに追加できるコンポーネントを作成すれば、ライトはとコンポーネントを持つエンティティになります。それは受け入れられますか?LightSourceLightSourcePosition また、従来の継承と従来のクラスを引き続き使用することは良い習慣ですか?たとえば、自分Rendererがどうなるかわからない!これはシステムではありません。唯一の機能は、カメラとシーンを取り込み、すべてをレンダリングして、エフェクト(シャドウなど)を適用することです。また、ゲームのコンテキスト、幅、高さを管理し、翻訳を行います...しかし、それはまだシステムではありません! 編集: ECSで見つけたリソースをリンクできますか?良いものを見つけるのに苦労しています。

1
私はこのコンポーネントアーキテクチャで正しい軌道に乗っていますか?
私は最近、深いクラス階層を取り除き、構成可能なコンポーネントで置き換えるために、ゲームアーキテクチャを刷新することを決定しました。私が置き換える最初の階層はアイテム階層です。私が正しい方向に進んでいるかどうかを知るためにいくつかのアドバイスをお願いします。 以前は、次のような階層がありました。 Item -> Equipment -> Weapon -> Armor -> Accessory -> SyntehsisItem -> BattleUseItem -> HealingItem -> ThrowingItem -> ThrowsAsAttackItem 言うまでもなく、乱雑になり始めており、これらは複数のタイプである必要があるアイテムに対する簡単な解決策ではありませんでした(つまり、一部の機器はアイテム合成で使用され、一部の機器はスロー可能です)。 次に、機能をリファクタリングして基本アイテムクラスに配置しようとしました。しかし、それから私はアイテムが未使用/余分なデータをたくさん持っていることを指摘していました。現在、私は他のゲームクラスに実行する前に、少なくとも私のアイテムに対して、アーキテクチャのようなコンポーネントを実行しようとしています。 これが、コンポーネントのセットアップについて私が現在考えていることです。 次のようなさまざまなコンポーネントのスロット(つまり、機器コンポーネントスロット、ヒーリングコンポーネントスロットなど、および任意のコンポーネントのマップ)を持つ基本アイテムクラスがあります。 class Item { //Basic item properties (name, ID, etc.) excluded EquipmentComponent* equipmentComponent; HealingComponent* healingComponent; SynthesisComponent* synthesisComponent; ThrowComponent* throwComponent; boost::unordered_map<std::string, std::pair<bool, ItemComponent*> > AdditionalComponents; } すべての項目コンポーネントは基本のItemComponentクラスから継承し、各コンポーネントタイプは、その機能を実装する方法をエンジンに伝える責任があります。つまり、HealingComponentは、アイテムをヒーリングアイテムとして使用する方法を戦闘力学に指示し、ThrowComponentは、アイテムをスロー可能なアイテムとして処理する方法を戦闘エンジンに指示します。 …

3
MVCまたはコンポーネント、あるいはその両方?
私は経験豊富な開発者ですが、最近ゲームプログラミングに取り組みたいと思っていますが、ご存知のように、ゲーム開発は他のほとんどのプログラミング形式とはまったく異なります(おそらくオペレーティングシステム開発によってのみ得られます)。 そうは言っても、Mike McShaffryによるGame Coding Complete(ISBN 978-1-58450-680-5)を読んでいます。 もともとは、通常のコンポーネント(SpacialComponent、VisualComponent、EntityLogicComponentなど)を組み合わせたコンポーネントモデルで開発しようとしましたが、McShaffry氏は非常に魅力的に見えるMVCモデルを使用することをお勧めしますが、どうすればよいかわかりません可能な限りコンポーネントモデルで動作させることができますが、コンポーネントがないと、MVCモデルは邪悪なモノリシックな継承モンスターのように見え、あまり柔軟ではないため、あまり興味がありません。 私はこの時点からどこに行くべきかについて本当に混乱しています。 より経験豊富なゲームコーディングブードゥーエキスパートは、考えや推奨事項を持っていますか? どうもありがとうございます!

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
C#/ XNAゲームでIronPythonコンポーネントと通信するにはどうすればよいですか?
私のXNAゲームはコンポーネント指向であり、位置、物理表現、レンダリングなどのさまざまなコンポーネントがあり、すべて基本Componentクラスを拡張しています。プレーヤーと敵にも、現在C#で定義されているコントローラーがあります。それらをIronPython(Pythonの.NET実装)を介してPythonスクリプトに変換したいと思います。私の問題は、これらのスクリプトの操作方法がわからないことです。 C#アプリケーションへのIronPythonの埋め込みの例は、Pythonスクリプトをコンパイルし、Pythonを介してコントローラーのUpdateメソッドを呼び出すスクリプトコンポーネントのようなものを作成する必要があることを示唆しています。 。 研究で何かが足りないように感じます。そこなければならないスクリプトをロードするための方法であること、(いずれかのC#のPythonスクリプト内または中)Pythonオブジェクトをインスタンス化して、その後、持っている直接私のC#コードでそのPythonオブジェクトへの参照を。 IronPythonオブジェクトを直接操作する方法はありますか、またはラッパーが必要ですか?

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 …

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

2
C ++エンティティコンポーネントシステムフレームワーク[終了]
現在のところ、この質問は、Q&A形式には適していません。私たちは回答が事実、参考文献、または専門知識によってサポートされることを期待しますが、この質問はおそらく議論、議論、投票、または拡張ディスカッションを誘います。この質問を改善でき、再開できると思われる場合は、ヘルプセンターにアクセスしてください。 7年前休業。 ActionScriptのAshやRush、JavaやC#のArtemisなど、C ++以外の他の言語のエンティティシステムフレームワークをいくつか見つけました。 私の質問は、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 …

3
コンポーネントベースのエンティティシステムAPIの命名の問題
私のエンジンはコンポーネントベースのエンティティシステムを内部で使用しており、スクリプト用にLuaにバインドしたいと考えています。 今、私はそれをタイピングするためのスクリプトを書く人々を救いたいと思います。C ++では、エンティティの位置を設定するには、次のようにします。 pEntity->GetComponent< CPoint >()->SetPos( Vector( X, Y ) ); つまり、Lua 1:1にバインドする場合は、次のことも行う必要があります。 ent:GetComponent( CP_POINT ):SetPos( 123, 456 ) しかし、正直に言って、エンティティの位置を設定するためだけに多くの文字を入力しますか? 私はそうは思わない、それが私がLuaからコンポーネントシステムを「隠した」理由です。 今、あなたがしていることは ent:SetPos( 123, 456 ) コンポーネントのものは内部的に処理されます。ent:AddComponentやent:RemoveComponentなどを使用して、Luaのコンポーネントを手動で追加および削除することもできます。 今、これも完璧ではないようです: エンティティメタテーブルは、すべてのコンポーネントのすべての機能を実行する必要があるため、乱雑になります ネーミングの問題:ent:SetJointMotorEnabled()やはりちょっと悪いようです スクリプトの快適性を危険にさらすことなく、コンポーネント関数のより良い命名体系をどのように見つけることができるかについてのアイデアはありますか?

6
Webゲームのアイテムにコンポーネントベースのシステムを実装する方法
コンポーネントベースのシステムを使用してアイテムを定義することに関する他のいくつかの質問と回答を読んで、PHPで記述されたWebゲームのアイテムとスペルに使用したい。実装にこだわっています。 このシリーズで提案されているDBスキーマを使用します(パート5ではスキーマについて説明します)。 http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/ これは、一般的なアイテムプロパティを持つアイテムテーブル、アイテムのすべてのコンポーネントをリストするテーブル、そして最後に、アイテムを構成するために使用される各コンポーネントテーブルのレコードがあることを意味します。 最初の2つを1つのクエリで一緒に選択できると仮定すると、各コンポーネントタイプに対してNクエリを実行します。クエリを実行する前に、データをmemcacheにキャッシュして最初にチェックできるので、これで問題ありません。memcacheから取得した場合でも、実装がリーンサイドである必要があるため、使用されるすべてのリクエストでアイテムを構築する必要があります。 しかし、アイテムのコンポーネントシステムを実装することに自信を持っているのは、まさにそのためです。使用する各コンポーネントから属性と動作をコンテナに取り込む必要があると思います。それを効果的に行う方法がわからないだけで、各コンポーネントを処理するための特別なコードを大量に作成することにはなりません。 たとえば、AttackComponentは、バトルコンテキスト内のターゲットをフィルタリングする方法を知る必要があり、攻撃動作を提供する必要がある場合もあります。同じアイテムにUsableComponentを含めることもできます。これにより、アイテムを使用し、同じバトルコンテキストから別の方法でフィルターした別のターゲットセットに何らかのエフェクトを適用できます。次に、アイテムのすべてのパーツがアクティブなパーツであるとは限りません。AttributeBonusComponentは、アイテムが装備された状態にあるとき、またはアイテムの詳細ページを表示するときにのみ起動する必要がある場合があります。 最終的に、アイテムを武器として使用するときにターゲットの正しいリストを取得できるように、すべてのコンポーネントをコンテナにまとめるにはどうすればよいですか?武器をアイテムとして使用できる時期を知っていますか?または、アイテムが提供するボーナスをキャラクターオブジェクトに適用するには? うさぎの穴の奥まで行きすぎたような気がして、目の前の簡単な解決策がつかめません。(それがまったく意味をなさない場合)。 同様に、ここからベストアンサーを実装すると、同じ質問がたくさんあるように感じます。 リレーショナルデータベース内の使用可能な在庫/オブジェクト/アイテム(カタナなど)の複数の「用途」(たとえば武器)をモデル化する方法
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.