/// <summary> /// 状態変更をリクエストします. /// 実際に状態変更されるまでに別のリクエストがあった場合、リクエストは上書きされます. /// </summary> public IAsyncStateMachine ChangeState(IAsyncState state) { Debug.LogFormat("<color=red>[{0}][ステート変更リクエスト] {1} -> {2}</color>", Time.frameCount, currentState, state.GetType().Name); // ステート変更に伴い、削除リストにあるコルーチンを削除する. removableCoroutines.ForEach(x => queuedCoroutines.Remove(x)); removableCoroutines.Clear(); Func <IEnumerator> onUpdate = () => OnUpdate(state); Func <IEnumerator> onExit = () => OnExit(state); Func <IEnumerator> onEnter = () => OnEnter(state, onExit); // コルーチンキューに追加 queuedCoroutines.Add(onEnter); queuedCoroutines.Add(onUpdate); queuedCoroutines.Add(onExit); // ステート変更時の削除コルーチンを追加. removableCoroutines.Add(onEnter); removableCoroutines.Add(onUpdate); removableCoroutines.Add(onExit); return(this); }
IEnumerator OnEnter(IAsyncState state, params Func <IEnumerator>[] removes) { Debug.LogFormat("<color=orange>[{0}][ステート開始] {1} -> {2}</color>", Time.frameCount, currentState, state.GetType().Name); previousState = currentState; currentState = state; foreach (var cb in removes) { removableCoroutines.Remove(cb); } yield return(state.OnEnter()); }
IEnumerator OnExit(IAsyncState state) { yield return(state.OnExit()); Debug.LogFormat("<color=green>[{0}][ステート完了] {1}</color>", Time.frameCount, state.GetType().Name); }