コンポーネント ベースのゲーム オブジェクト システムを作成しています。いくつかのヒント:
GameObject
の単なるリストですComponents
。- あります
GameSubsystems
。たとえば、レンダリング、物理などです。それぞれGameSubsystem
に、いくつかの へのポインタが含まれていますComponents
。GameSubsystem
は非常に強力で柔軟な抽象化です。ゲーム世界のあらゆるスライス (または側面) を表します。
Components
登録する仕組みGameSubsystems
(GameObject
作成・合成時)が必要です。4 つのアプローチがあります。
- 1:責任パターンの連鎖。Every
Component
は every に提供されますGameSubsystem
。GameSubsystem
どちらComponents
を登録するか (およびそれらをどのように編成するか) を決定します。たとえば、GameSubsystemRender は Renderable Components を登録できます。
プロ。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*) のようなものを呼び出します。
オブザーバーのパターン。Component
"update" イベント (によって送信されGameSubsystem(s)
ます) をサブスクライブします。
プロ。パフォーマンス。Approach 1
やのような不要なチェックはありませんApproach 2
。
コン。Components
とひどく結合していGameSubsystems
ます。
- 4:メディエーターパターン。
GameState
( を含むGameSubsystems
) registerComponent(Component*) を実装できます。
プロ。Components
そしてGameSubystems
お互いに何も知らない。
コン。C++ では、醜く遅い typeid-switch のように見えます。
質問:
コンポーネント ベースの設計で最もよく使用されているアプローチはどれですか? プラクティスは何と言っていますか?の(データ駆動型)実装に関する提案はありApproach 4
ますか?
ありがとうございました。