見出し画像

【Unity】【C#】Finite-State-Machine を使いやすくする

ゲームの進行を管理する上で便利なStateMachineですが、Unityでのイケてる実装方法を探した所、良さげなのを見つけました。

ただし、そのまま実装すると現在のStateがInspectorに表示されないためデバッグで不便です。そこでInspectorにも表示されるよう対応を行いました。

概要

・Inspectore表示用のcurrentStateフィールドを生成する。

・状態遷移時は遷移用のメソッドを作成して、本来の変数fsmの更新とcurrentStateにfsmの代入を行う。

・実行テストではButtonクリックで状態遷移を行う。

コード

using UnityEngine;
using MonsterLove.StateMachine;

public class StateMachineTestManager : MonoBehaviour {

    public enum States
    {
        Init,
        Play,
        Win,
        Lose
    }
    StateMachine<States> fsm;

    //Inspector表示用
    [SerializeField]States currentState = new States();

    private void Awake()
    {
        Initialize();
    }

    void Initialize(){
        fsm = StateMachine<States>.Initialize(this);
        ChangeState(States.Init);
    }

    //状態遷移メソッド
    public void ChangeState(States states){
        fsm.ChangeState(states);
        currentState = fsm.State;
    }

    //Buttonに登録
    public void OnClick()
    {
        Debug.Log("OnClick");
        Debug.Log(fsm.State);
        switch (fsm.State)
        {
            case States.Init:
                ChangeState(States.Play);
                break;
            case States.Play:
                ChangeState(States.Win);
                break;
            case States.Win:
                ChangeState(States.Lose);
                break;
            case States.Lose:
                ChangeState(States.Init);
                break;
            default:
                break;
        }
    }
}

実行結果

参考

開発中のゲーム

ポケモン+デジタルカードゲーム をモバイル向けに開発してます。



いいなと思ったら応援しよう!