コンポーネントベースのゲームオブジェクトシステムを作成しています。いくつかのヒント:
GameObject
は単にのリストですComponents
。- あります
GameSubsystems
。たとえば、レンダリング、物理などです。それぞれにGameSubsystem
は、のいくつかへのポインタが含まれていますComponents
。GameSubsystem
非常に強力で柔軟な抽象化です。ゲームの世界のあらゆるスライス(または側面)を表します。
登録の仕組みでは必要ありComponents
でGameSubsystems
(ときGameObject
に作成および構成されているが)。4つのアプローチがあります。
- 1:一連の責任パターン。すべて
Component
がすべてに提供されますGameSubsystem
。GameSubsystem
どちら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
ますか?
ありがとうございました。
Components
中には、GameObjects
私の質問の範囲外です。コンポーネントベースのアプローチに関する記事を読んだり、興味がある場合はこのサイトで質問してください。あなたの考えGameSubsystem
は全く間違っています。