この質問またはそのバリエーションがたくさん出回っていると思うので、私が言っていることが重複していて、答えが他の場所にある場合は、お知らせください.
私はゲーム エンジンの設計を研究しており、コンポーネント ベースのエンティティ モデルに出会いました。有望に聞こえますが、私はまだその実装に取り組んでいます。
エンジンがいくつかの「サブシステム」で構成され、レンダリング、サウンド、ヘルス、AI などの側面を管理するシステムを検討しています。各サブシステムには、ヘルスのヘルス コンポーネントのようなコンポーネント タイプが関連付けられています。サブシステム。NPC、ドア、何らかの視覚効果、プレイヤーなどの「エンティティ」は、1 つまたは複数のコンポーネントで構成されており、それらを組み合わせることでエンティティにその機能を提供します。
情報伝達の 4 つの主なチャネルを特定しました。コンポーネントは現在のエンティティ内のすべてのコンポーネントにブロードキャストでき、コンポーネントはそのサブシステムにブロードキャストでき、サブシステムはそのコンポーネントにブロードキャストでき、サブシステムは他のサブシステムにブロードキャストできます。
たとえば、ユーザーがキャラクターを動かしたい場合は、キーを押します。このキーの押下は、入力サブシステムによって取得され、イベントがブロードキャストされ、プレーヤー サブシステムによって取得されます。次に、プレーヤー サブシステムは、このイベントをすべてのプレーヤー コンポーネント (およびそれらのコンポーネントが構成するエンティティ) に送信します。これらのプレーヤー コンポーネントは、独自のエンティティの位置コンポーネントと通信して先に進み、移動します。
キーを押すためのこれらすべては少し複雑に思えますが、私は確かにこのアーキテクチャの改善にオープンです。とにかく、私の主な質問はまだ続きます。
イベント自体については、訪問者パターンのようにイベントがどこで振る舞うかを考えました。私が望んでいることの重要性は、イベントがサポートしていないコンポーネントに遭遇した場合 (移動イベントは AI や健康とは直接関係がないため)、そのコンポーネントを無視することです。イベントが後を追っているコンポーネントを見つけられなくても、それは問題ではありません。
訪問者パターンはほぼ機能します。ただし、コンポーネントのすべてのタイプ (つまり、visitHealthComponent、visitPositionComponent など) に関係がない場合でも、仮想関数が必要になります。これらの関数を空のままにしておくこともできます (そのため、これらのコンポーネントに遭遇した場合は無視されます) が、コンポーネントを追加するたびに別の関数を追加する必要があります。
私の希望は、必ずしも他の場所に何かを追加することなくコンポーネントを追加し、他のものを台無しにすることなくイベントを追加できることでした.
だから、私の2つの質問:
- 効率や柔軟性などの点で、私の設計で可能な改善点はありますか?
- イベントを処理する最適な方法は何でしょうか?