【Unity】Stateパターンっぽい何かで状態遷移の実装
はじめに
AをしたらBに、BをしたらCに、CをしたらAに...
このようなケースをどのように処理すればいいかの一例として紹介します(既出の場合はすみません)
今回は以下のような3点を移動する処理を作成したいと思います
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; } }
説明不足な部分が多々あると思いますが、ご容赦ください
また、何かアドバイス等ありましたらドシドシお願いします!!!