【Unity】Stateパターンっぽい何かで状態遷移の実装

はじめに

AをしたらBに、BをしたらCに、CをしたらAに...

このようなケースをどのように処理すればいいかの一例として紹介します(既出の場合はすみません)

 今回は以下のような3点を移動する処理を作成したいと思います

f:id:atas10703:20190216212500g:plain

interfaceの作成

以下のようなインターフェースを作成します

public interface IState {
    void Initialize();  // 各状態での変数の初期化
    void Execution();   // 各状態の実行
}

各状態の作成

原点に移動するコードです

using UnityEngine;

public class ToOrigin : MonoBehaviour, IState {

    private Vector3 originPos;

    public void Initialize() {
        originPos = Vector3.zero;
    }

    public void Execution() {
        // 移動完了後、次のstateへ
        if (transform.position == originPos) {
            NextState();
        }
        transform.position = Vector3.MoveTowards(transform.position, originPos, Time.deltaTime);
    }

    public void NextState() {
        StateManager.NextState();
    }
}

残りの2つの状態は上記のコードと酷似しているため省略します

これらのコードは動かすcubeにアタッチします

状態を管理するマネージャーの作成

using System;
using System.Linq;
using UnityEngine;

// 実行したいstateの数だけ用意
public enum State {
    origin,
    right,
    up,
}

public class StateManager : MonoBehaviour {

    private IState[] stateList;     // 全stateを格納する配列
    private static int stateCount;  // stateの数
    private static State currentState;  // 実行するstate

    private void Start() {
        stateCount = Enum.GetValues(typeof(State)).Length;
        stateList = new IState[stateCount];

        SetStateList();

        // 全stateの初期化
        stateList.ToList().ForEach(state => state.Initialize());

        currentState = State.origin;
    }

    // 全stateの取得
    private void SetStateList() {
        stateList[(int)State.origin] = FindObjectOfType<ToOrigin>();
        stateList[(int)State.right] = FindObjectOfType<ToRight>();
        stateList[(int)State.up] = FindObjectOfType<ToUp>();
    }

    private void Update() { 
        stateList[(int)currentState].Execution();
    }

    // stateの遷移
    public static void NextState() {
        currentState = (int)currentState == stateCount - 1 ? 0 : currentState + 1;
    }
}

説明不足な部分が多々あると思いますが、ご容赦ください

また、何かアドバイス等ありましたらドシドシお願いします!!!