- Home /
- Unity3D
- / Unity3D Design Patterns – State – Building a Unity3D State Machine
デザインパターンは、ソフトウェアプロジェクトで見られる一般的な問題に対する再利用可能なソリューションです。 Unity で優れたデザイン パターンを使用すると、プロジェクトをクリーンで保守可能、かつ拡張しやすい状態に保つことができます。 また、ビルドも簡単になります。 今日は、State パターンと、Unity3D で State Machine を構築する基本について説明します。
State パターンは、オブジェクト指向でステート マシンを実装する動作ソフトウェア デザイン パターンです。 … このパターンは、コンピュータ プログラミングで、内部状態に基づいて同じオブジェクトのさまざまな動作をカプセル化するために使用されます。
私が好きではない実装.
Unityで状態パターンを実装できる方法がいくつかあります。 私がよく目にする方法の 1 つは、switch 文を使用する方法です。
Problems
これは技術的には機能しますが、時間の経過とともに発生する深刻な問題がいくつかあります。 攻撃、防御、帰還、およびその他の作成したい状態はすべて、ここに追加する必要があります。 これは、AIのマスタークラスが大きく肥大化することにつながります。 また、ロジックの種類ごとに同じクラスを編集することになるので、コードが壊れやすくなります。
また、ステートの入力と終了時に発生するイベントを処理する優れた方法はありません。 かなり頻繁に、キャラクターまたはオブジェクトが状態に入るときに何かを行い、その状態の間にアクションを繰り返し、状態を離れるときにまったく異なることを行いたいとします。
この設定では、状態を入力および終了するためのスイッチをさらに追加する必要があり、クラスがさらに肥大化し、すべてが理解しにくくなります。
A better Implementation
より良いアプローチは、各状態を独自のクラスとし、一般に、それらを継承するベース ‘state’ クラスを持つことです。 新しい状態を追加したい場合は、新しいクラスを作成するだけです。
このメソッドを使用すると、キャラクター クラスは少し違って見えます:
クラスがほぼ同じサイズであることに気付くかもしれませんが、それは最初のバージョンが実際には何もしないためです(主に、消化しやすい状態を維持する)。
How does it work?
更新メソッドを見ると、それは単に現在の状態に対して Tick() メソッドを呼び出すだけであることがわかるでしょう。
また、SetState メソッドがあり、キャラクターが入るべき状態を渡すことができます。 SetState を呼び出して異なる状態を渡すことにより、キャラクター クラス自体を変更することなく、このキャラクターの動作を完全に変更できます。
設定によっては、ガベージ コレクションを避けるために状態を保持し、それらを切り替えることが推奨される場合があります。 しかし、状態の変更が高速で、それが重要なプラットフォーム上にある場合は、心に留めておく価値があります。
State クラスとは何ですか。 この例では、すべての状態が何らかの方法で文字とインターフェイスするため、文字参照もこのステート ベース クラスに追加されます。 ステート クラスのコンストラクタで文字を取得し、それを protected 変数に格納して、ステート クラスで使用できるようにします。
また、抽象的な Tick() メソッドを用意しました。
対照的に、OnStateEnter() & OnStateExit() の 2 つの仮想メソッドはオプションです。
以上、ステート クラスの全体です。 ホームの目的地を実際に定義していないので、デフォルトの Vector3.zero です。
Tick
Tickメソッドは、目的地(0、0、0)に向かって移動するようキャラクターに指示します。 実際のプロジェクトでは、この動きはおそらく「CharacterMovement」クラスなどの別のコンポーネントで制御されるでしょう。
そして、キャラクターが家にたどり着いたかどうかをチェックし、もしそうなら「wander」状態に切り替えるようキャラクターに指示します。 新しい状態を作成するときに、キャラクターを渡していることに注意してください。
EnterState
また、OnStateEnter によって帰宅状態になったときに、キャラクターの色を変更します。
別の状態を作成する – Wander
ステート マシンが意味をなすには、1 つ以上の状態が必要です。 実際、帰路の状態は、いったんキャラクターをさまよう状態に切り替えたいので、さまよう状態を作成する必要があります。 その位置に到達すると、別の場所を選んでさまよう。
これを、(wanderTime変数に基づいて)5秒間さまようまで続ける。
この状態は、OnStateEnter メソッドによって、キャラクターの色を緑に変更します。
それでは、どのように見えるか見てみましょう。
緑色の間はうろうろして、青色になったらまた家に帰る、その繰り返しです。
フルキャラクター
上でフルキャラクター クラスはここで MoveToward メソッドを使用していると述べました。 繰り返しますが、実際のプロジェクトでは、基本的な動きを別のコンポーネントに分離しておくことをお勧めします。
結論
ステートパターンは驚くほど強力です。 このパターンに慣れれば、AI システムやメニューなどを簡単に構築できます。
このステート マシンは非常に基本的で、状態をキャッシュする (新しいメモリ割り当てを避ける) などの拡張や、ニーズに合わせてカスタマイズすることが可能です。 スクリプト可能なオブジェクトを使用してセットアップされたステート マシンは、デザイナーがコードに触れることなくエディター/インスペクターで簡単に設定できますが、これはもう少し複雑なテーマなので、後で掘り下げるかもしれません。