Beispiel #1
0
    void getState()
    {
        AnimatorStateInfo currentState = animator.GetCurrentAnimatorStateInfo(0);

        if (currentState.IsName("idle") || currentState.IsName("walk"))
        {
            interruptable = Interruptable.Yes;
            flippable     = Flippable.Yes;
            moveable      = Moveable.Yes;
        }
        else if (currentState.IsName("crouch"))
        {
            interruptable = Interruptable.Yes;
            flippable     = Flippable.No;
            moveable      = Moveable.No;
        }
        else if (currentState.IsName("air") || currentState.IsName("jumptoair") || currentState.IsName("air_P2"))
        {
            interruptable = Interruptable.Yes;
            flippable     = Flippable.No;
            moveable      = Moveable.Yes;
        }
        else
        {
            interruptable = Interruptable.No;
            flippable     = Flippable.No;
        }
        if (currentState.IsName("Land"))
        {
            moveable = Moveable.No;
        }
    }
        /// <summary>
        /// Поток управления логическим процессом.
        /// Переходы между состояниями выполняются в этом потоке.
        /// </summary>
        private void MachineProc()
        {
            Debug.WriteLine($"Entering MachineProc thread id {Thread.CurrentThread.ManagedThreadId}");

            MachineProcEnter();

            while (!AppCore.Exiting && !_shutdown)
            {
                //
                //    Ждём в цикле 10 порциями по 100 мс.
                //    Каждые 100 мс. проверяем флаги завершения (вышке).
                //    Если флаги взведены, завершение потока.
                //
                var signal = Interruptable.Wait(1000, 100, Signal);

                //
                //    Также каждые 100 мс. проверяется необходимость перехода.
                //
                if (Interruptable.Signal.Application == signal)
                {
                    lock (this)
                    {
                        Debug.Assert(null != _stateChanging);

                        var transition = this[_state, _stateChanging.Value];

                        if (null != transition)
                        {
                            transition();
                        }
                        else
                        {
                            //
                            //    Выкидывать исключение не имеет смысла, т.к. это внутренний поток исполнителя.
                            //    Поэтому мы просто отбрасываем запрос на изменение.
                            //
                            _stateChanging = null;
                            _stateChanged.Set();
                        }
                    }
                }
            }

            Debug.WriteLine($"Leaving MachineProc thread id {Thread.CurrentThread.ManagedThreadId}");

            MachineProcLeave();
        }