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(); }