コンポーネントベースのゲームエンジンで、ゲームオブジェクト/コンポーネント間の関係に困っています。
リレーションをどこに保存し、どのように削除しますか?
簡単にするために、ここに例を示します。
グラディウス クローン ゲームは、2 種類のゲーム オブジェクトで構成されます。
- ロケット=本体部品+砲塔部品
- フローティング タレット= タレット コンポーネント (単体)
コンポーネントの詳細は次のとおりです。
- メイン ボディ コンポーネント= 1 つの物理的なボディ + 1 つのグラフィック ボディ
- タレット コンポーネント= 1 つの物理的なボディ + 1 つのグラフィック ボディ
砲塔コンポーネントは、本体コンポーネントとの関係(物理的制約または所有権) を持つように設計されています。
両方のコンポーネントの前にリレーションを削除する必要があります。
- たとえば、この場合のリレーションには、Bullet Physics などの外部の物理ライブラリによって実装された物理的な制約も含まれています。
これらは非常に例に特化した説明であり、念のため....
ロケットを削除する手順は、次の順序で行う必要があります:-
- 制約を削除
- 本体部品と砲塔部品を削除(順番は任意)
メインボディ コンポーネントが削除されたときにリレーションも削除され、タレット コンポーネントだけが残されるので、フローティング タレットにします。
リレーションはどこに保存する必要がありますか? (すべて問題ないようですが、次の質問に関連しています。)
- 新しい専用ゲーム オブジェクト (新しいエンティティ) の新しいコンポーネント内
- Rocketと同じエンティティ内の新しいコンポーネント内
- この特定の種類の関係のリストを保持する新しい管理システム内
関係を削除するにはどうすればよいですか? (どちらも悪い考えのようです。)
Main Body ComponentまたはRocketの差し迫った削除をチェックするフラグを作成し、他のコンポーネントを削除する直前に新しい専用システムを呼び出してリレーションを削除します。これは、タイム ステップごとに他のマネージャー システムの前に呼び出す必要があります。
本体コンポーネントやロケットを削除したい場合は、他の既存の管理者が新しい専用システムを呼び出しましょう
関係の種類が多い一般的な場合の答えを期待していました。(ゲームオブジェクトまたはコンポーネント間)
編集 1 : ロケットのデストラクタに直接所有権を付与し、コードを追加することに関する提案されたソリューションは、コンポーネント ベースの設計にまったく反します。
- これにより、3 つのコンポーネント (制約を含む) が非常に結合されます。
- さらに、コンポーネントは重要な機能を持つべきではありません。
デストラクタはその1つであり、避けるべきだと思います。
(私はかつていくつかのオブジェクトの肥大化したデストラクタを持っていました.それはすべての良いモジュール性を破壊します.)