プレイヤーと敵のAIをゲームに実装し始めていますが、これをコンポーネントベースのゲームアーキテクチャに最適に実装する方法について混乱しています。
次のプレイヤーキャラクターがいて、静止したり、走ったり、剣を振ったりできるとします。プレイヤーは、静止状態とランニング状態の両方からスイングソード状態に移行できますが、プレイヤーが立ち上がったり走り回ったりする前にスイングを完了する必要があります。スイング中、プレーヤーは歩き回ることができません。
ご覧のとおり、2つの実装アプローチがあります。
- すべてのプレーヤーロジックを含む単一のAIコンポーネントを作成します(実際のコンポーネントから切り離されるか、PlayerAIComponentとして埋め込まれます)。プレーヤーエンティティを構成する個々のコンポーネント間の結合を作成せずに、状態制限を強制する方法を簡単に実行できます。ただし、AIコンポーネントは分割できません。たとえば、立ち上がって歩き回るだけの敵や、歩き回って剣を振り回すだけの敵がいる場合、新しいAIコンポーネントを作成する必要があります。
- 動作をコンポーネントに分割し、それぞれが特定の状態を識別します。次に、SandComponent、WalkComponent、SwingComponentを取得します。移行ルールを実施するには、各コンポーネントを結合する必要があります。SwingComponentは、スイングの間、StandComponentとWalkComponentを無効にする必要があります。たまに剣を振り回すだけの敵がいる場合、SwingComponentが存在する場合にのみWalkComponentを無効にする必要があります。これにより、より良いコンポーネントの組み合わせが可能になりますが、依存関係が追加されるたびに保守性の悪夢につながる可能性があります。既存のコンポーネントは、依存関係がキャラクターに課す新しい要件でうまく動作するように更新する必要があります。
理想的な状況は、エンジンやスクリプトコードの1行に触れることなく、コンポーネントをコンテナにドラッグすることで、デザイナーが新しい敵/プレイヤーを構築できることです。スクリプトのコーディングを回避できるかどうかはわかりませんが、できるだけシンプルに保ちたいと思います。
すべてをまとめる:すべてのAIロジックを1つのコンポーネントに分割するか、各ロジック状態を個別のコンポーネントに分割して、エンティティバリアントをより簡単に作成する必要がありますか?
編集:私は私が最初と2番目の状況で何を意味したかについていくつかの混乱があると思う。以下の図で説明しようとしました。
個々の状態とエンティティ間の関係に注意してください。最初の状況では、AIコンポーネントはエンティティに配置される前に事前に構築されます。デザイナーが選択できるのは、プログラマーが利用できるAIComponentsの異なるセットからのみです。2番目の状況には、他のコンポーネントと同じレベルの異なる状態があります。設計者は、プログラマーの干渉なしに、独自のAIでエンティティを作成できるようになりました。
問題は、これらがコンポーネントベースのエンティティでAIを構築するための2つのオプションであり、もしそうなら、最大の柔軟性を与えるものは何ですか?