ステートマシンは、コンポーネントベースのアーキテクチャで有害な依存関係を引き起こすようです。
具体的には、状態マシンと状態関連の動作を実行するコンポーネントとの間の通信はどのように処理されますか?
私がいる場所:
- コンポーネントベースのアーキテクチャは初めてです。
- 私は格闘ゲームを作っていますが、それは重要ではないと思います。ステートマシンを使用して、「クラウチング」、「ダッシュ」、「ブロッキング」などの状態を切り替えることを想定しています。
- この状態管理手法は、コンポーネントベースのアーキテクチャにとって最も自然なシステムであることがわかりましたが、これまでに読んだ手法とは矛盾しています: 可変動作文字の動的ゲームオブジェクトコンポーネントシステムすべてのコンポーネントをアクティブ化/非アクティブ化することをお勧めしますアクティベーションの条件を継続的にチェックすることにより、自分自身。
- 「実行中」または「ウォーキング」などのアクションは状態として理にかなっていると思います。これは、https://gamedev.stackexchange.com/a/7934で受け入れられている応答とは一致しません。
これは便利ですが、あいまいです。コンポーネントベースのゲームアーキテクチャに動作を実装する方法は?ステートマシンのみを含む別のコンポーネントを使用することをお勧めします。ただし、これには、ステートマシンコンポーネントと他のほぼすべてのコンポーネントとの間に何らかの結合が必要です。このカップリングがどのように処理されるべきか理解できません。これらはいくつかの推測です:
A. コンポーネントはステートマシンに依存します。コンポーネントは、列挙定数を返す
ステートマシンコンポーネントへの参照を受け取りますgetState()
。コンポーネントは定期的に自身を更新し、必要に応じてこれを確認します。B. ステートマシンはコンポーネントに依存します。
ステートマシンコンポーネントは、監視しているすべてのコンポーネントへの参照を受け取ります。getState()
メソッドを照会して、どこにいるかを確認します。C. それらの間のいくつかの抽象化
イベントハブを使用しますか?コマンドパターン?D. コンポーネントを参照する個別の状態オブジェクト状態
パターンが使用されます。コンポーネントのセットをアクティブ化/非アクティブ化する個別の状態オブジェクトが作成されます。状態マシンは状態オブジェクトを切り替えます。アスペクトの実装としてコンポーネントを見ています。彼らはその側面を実現するために内部的に必要なすべてを行います。コンポーネントは、他のコンポーネントに依存せずに、単独で機能する必要があるようです。いくつかの依存関係が必要であることは知っていますが、ステートマシンはすべてのコンポーネントを制御したいようです。