Unity State Management

ステートマネージャ

using UnityEngine;
using UniRx;
 
/// <summary>
/// GameStateManager
/// 他のスクリプトから State を参照される可能性があるため
/// 早めに初期化(DefaultExecutionOrder = -1)
/// </summary>
[DefaultExecutionOrder(-1)]
public class HogeStateManager: MonoBehavior {
    /// <summary>
    /// 初期ステート
    /// </summary>
    [SerializeField]
    private HogeState initialState = HogeState.SelectDifficultyPhrase;
 
    /// <summary>
    /// 現在のステートが保持されている
    /// </summary>
    public BehaviorSubject<HogeState> State;
 
		void Start() {
				State = new BehaviorSubject<GameState>(initialState);
		
				State.Subscribe(state => {});
 
				State.OnNext(HogeState.XXXX);
		}
}

ImtStateMachine

BelColo/ImtStateMachineUseSample

using IceMilkTea.Core;
using UnityEngine;
 
public class Hoge : MonoBehaviour {
    private enum StateEventId {
        Event,
    }
 
    private ImtStateMachine<Hoge> stateMachine;
    private int fuga = 1;
 
    private void Awake() {
        stateMachine = new ImtStateMachine<Hoge>(this);
        stateMachine.AddTransition<AScene, BScene>((int) StateEventId.Event);
        stateMachine.SetStartState<AScene>();
    }
 
    public void Start() {
        this.UpdateAsObservable()
            .Subscribe(_ => stateMachine.Update());
    }
 
    private class AScene : ImtStateMachine<Hoge>.State {
        protected internal override void Enter() {
            var fuga = Context.fuga;
        }
 
        protected internal override void Exit() {
        }
    }
 
    private class BScene : ImtStateMachine<Hoge>.State {
        protected internal override void Enter() {
        }
 
        protected internal override void Exit() {
        }
    }
}