Exemple #1
0
        /// <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);
        }
Exemple #2
0
        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());
        }
Exemple #3
0
        IEnumerator OnExit(IAsyncState state)
        {
            yield return(state.OnExit());

            Debug.LogFormat("<color=green>[{0}][ステート完了] {1}</color>", Time.frameCount, state.GetType().Name);
        }