ゲームサブシステムにゲームオブジェクトコンポーネントを登録しますか?(コンポーネントベースのゲームオブジェクトデザイン)


11

コンポーネントベースのゲームオブジェクトシステムを作成しています。いくつかのヒント:

  1. GameObjectは単にのリストですComponents
  2. ありますGameSubsystems。たとえば、レンダリング、物理などです。それぞれにGameSubsystemは、のいくつかへのポインタが含まれていますComponentsGameSubsystem非常に強力で柔軟な抽象化です。ゲームの世界のあらゆるスライス(または側面)を表します。

登録の仕組みでは必要ありComponentsGameSubsystems(ときGameObjectに作成および構成されているが)。4つのアプローチがあります。


  • 1:一連の責任パターン。すべてComponentがすべてに提供されますGameSubsystemGameSubsystemどちらComponentsを登録するか(およびそれらを整理する方法)を決定します。たとえば、GameSubsystemRenderはレンダリング可能コンポーネントを登録できます。

プロ。Componentsそれらがどのように使用されるかについては何も知りません。低カップリング。A.新しいを追加できGameSubsystemます。たとえば、すべてのComponentTitleを登録し、すべてのタイトルが一意であり、タイトルごとにオブジェクトをクエリするためのインターフェイスを提供することを保証するGameSubsystemTitlesを追加しましょう。もちろん、この場合、ComponentTitleを書き換えたり継承したりしないでください。B.既存のを再編成できGameSubsystemsます。たとえば、GameSubsystemAudio、GameSubsystemRender、GameSubsystemParticleEmmiterをGameSubsystemSpatialにマージできます(すべてのオーディオ、エミッターを配置Componentsし、同じ階層にレンダリングし、親相対変換を使用します)。

詐欺。すべてのチェック。非常に非効率的です。

詐欺。Subsystemsについて知っていComponentsます。


  • 2:それぞれが特定のタイプをSubsystem検索しComponentsます。

プロ。よりも優れたパフォーマンスApproach 1

詐欺。Subsystemsまだ知っていComponentsます。


  • 3:Component自身をに登録しGameSubsystem(s)ます。コンパイル時にGameSubsystemRendererがあることがわかっているので、ComponentImageRenderはGameSubsystemRenderer :: register(ComponentRenderBase *)のようなものを呼び出します。

プロ。パフォーマンス。のように不要なチェックはありませんApproach 1

詐欺。Componentsとうまく結合されていませんGameSubsystems


  • 4:メディエーターパターン。GameState(を含むGameSubsystems)registerComponent(Component *)を実装できます。

プロ。ComponentsそしてGameSubystemsお互いについて何も知りません。

詐欺。C ++では、醜くて遅いtypeid-switchのように見えます。


質問: どのアプローチがより優れており、コンポーネントベースの設計で主に使用されていますか 練習は何を言いますか?の実装に関する提案はありApproach 4ますか?

ありがとうございました。


私は過剰設計のにおいがします。コンポーネントは自身をGameObjectに登録します。GameSubsystemが私が思っているとおりの場合、それは、GameObjectに一度に追加できるコンポーネントのリストにすぎません。ゲームオブジェクトとコンポーネントがどのように組み合わされるか(それらが互いに検索するのか?なぜ?)ある種の「魔法」があるようにそれをどのように説明するか。また、基本的にはエンジンのすべてにコンポーネントを使用しようとしているという感覚も得られます。何それの価値のために私は唯一のオプション3または4検討する
LearnCocos2D

@GamingHorror、登録Components中には、GameObjects私の質問の範囲外です。コンポーネントベースのアプローチに関する記事を読んだり、興味がある場合はこのサイトで質問してください。あなたの考えGameSubsystemは全く間違っています。
2010年

私は、エンジンコンポーネントではなく、ゲームロジック用のコンポーネントを開発することに偏っています。あなたの説明はその方向を示しているようです。私はコンポーネントシステムをよく理解しています。使用した用語、特にGameSubsystemに慣れていないので、コースから外れたと思います。私が読んだことから、コンポーネントだけですべて(たとえば、エンジン全体)を構築しようとしているように聞こえました。
LearnCocos2D 2010年

はい、「コンポーネントベースのゲームオブジェクト」と「コンポーネント指向プログラミング」は異なる用語であり、混乱を招く可能性があります。偏見を持たないでください。 "bilased"にしてください:scottbilas.com/files/2002/gdc_san_jose/game_objects_slides.ppt
topright

回答:


3

ドア番号3 ...コンポーネントは自身をGameSubsystemに登録します

コンポーネントは、カップリングをGameObject自体から抽象化しておくために配置されています。どういうわけか、どこかで実際に何かがサブシステムと相互作用する必要があり、これがコンポーネントとその目的です。

この場合、結合は実際には悪いことではありません。

この場合、基本的にパフォーマンスが必要ですが、システムに複雑さが予想される場合、他のオプションの検索スタイルのアプローチを利用する余裕はありません。

最後に、あるサブシステムが別のサブシステムに反応する必要がある場合(レンダラー、物理、オーディオはすべて、何かが発生したときに何かを行う必要があります)、コンポーネントはゲームオブジェクトを通じて相互にこれを促進し、この特定のタイプのシステム間カップリングをコンポーネント。


1
それは良い。しかし、コンポーネントはどのようにGameSubsystemsについて知っていますか?すべてのサブシステムはシングルトンですか?それは醜くありませんか?...依存関係注入のような別のソリューションについて考えています...しかし、いつ、誰がサブシステムインスタンスを各コンポーネントに渡すのですか?
ダニ

@Daniコンポーネントは、サブシステムインスタンスに直接アクセスする必要はありません。登録の実行を要求するメッセージを送信するだけでよく、サブシステムが何であるかを知る必要はありません(ただし、ほとんどの場合)。シングルトンでしょうか?ほとんどの場合、サブシステムごとに1つのサブシステムインスタンスしか必要ない場合でも、これは要件ではありません。
Pablo Ariel、

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