例えばキャラクターの状態管理で
・アイドル
・走る
・攻撃
・ジャンプ
こんな状態を管理する際にどういう処理にしているでしょうか…?
一番簡単な方法で考えれば各状態のフラグを用意して状態遷移させる事や、
状態を管理するビットを用意して内包している状態を判定させる方法などがありそうですが、
どちらもupdate内が段々複雑になっていき、状態が多くなって行くほどにバグの温床になりそうな予感がぷんぷんします。
UnityではPlayMakerやuStateなどのAssetも用意されていますが、
もう少しフランクに状態を管理したいと思い作ってみる事にしました。
考え方はStateパターンの通りなのですが、
処理自体はMonoBehaviourを継承しているクラスが行い、
状態管理のみを行うクラスを作るという方法です。
まぁ百聞は一見に如かずという事で早速
オブジェクトの作成
まずは適当なオブジェクトを用意します。
今回分かりやすいようにテキストにしましたが、実際はキャラクターでも何でもかまいません。
TextController.csをCanvas/Textオブジェクトにアタッチします。
今回の処理は
初期状態から1秒後にStateAに遷移
StateAから1秒後にStateBに遷移
StateBから1秒後に初期状態に遷移
という事をやります
TextState.cs
TextController.cs
こんな感じでしょうか?
TextStateクラスは完全に独立していますので、新しいStateを追加しても影響範囲はStateクラス内だけで留まります。
Controllerクラスは自分で行っているオブジェクトへの処理をStateクラスに委譲しているだけなので、必要なStateを必要な時に呼び出す事で状態遷移が可能です。
例えばこのTextControllerを基底クラスにして、子のControllerクラスを作成してもよいでしょう。
ただ、Processorと基底クラスをnamespaceでまとめましたが、
これ分けておいた方が後々楽になると思います。
私はこんな感じでキャラクターの状態管理や、
ログイン処理の状態管理などを行っています。
もっといい方法があるよ!とかご意見マサカリ歓迎しておりますm( )m