最後に、命令を管理するクラスを作成します。
<= クリックすると開きます。
public class StateMachine
{
private IState currentState;
// ステートの更新
public void ChangeState(IState newState)
{
// 現在進行しているステートがある場合
if (currentState != null)
{
// そのステートの終了処理を行う
currentState.Exit();
}
// 新しいステートを登録し、開始処理を実行
currentState = newState;
currentState.Enter();
}
public void Update()
{
// 現在のステートが設定されている場合
if (currentState != null)
{
// 現在のステートの処理を実行
currentState.Execute();
}
}
}
ChangeState メソッドを利用し、IState インターフェースを実装しているオブジェクトを currentState に登録しています。
ポイントとしては、currentState 変数は IState インターフェースであるため、
クラスに関わらず、IState インターフェースを実装していれば代入できる点です。
そのため、MoveState クラス、JumpState クラスのどちらであっても currentState 変数に代入できます。
この処理を行うことにより、StateMachine クラスは現在のステートがどのステートであるかを管理することが出来ます。
さらに ChangeState メソッドでは、前のステートが存在する場合には Exit メソッドを実行してステートの終了処理を行った上で、
新しいステートへの切り替え処理を行ってから、Enter メソッドを実行してステートの開始処理を行います。
Update メソッドでは currentState 変数が存在するか確認し、(現在のステートを確認)
currentState 変数に格納されている IState インターフェースを実装しているクラスの Execute メソッドを実行します。
Execute メソッドは MoveState クラスと JumpState クラスではメソッド内の処理が異なるため、同じメソッドを実行していますが、処理の振る舞いが変わります。