예제 #1
0
        public void OnStateControllerUpdate(object sender, StateControllerEventArgs args)
        {
            var state_controller = (IStateController)sender;

            var info = new ManagedStateEventInfo <ManagedStateEventArgs>(
                ManagedStateEventType.StateUpdate,
                state_controller.OnManagedStateVerifyUpdate,
                state_controller.OnManagedStateUpdate,
                AnyStateUpdate.Invoke,
                new ManagedStateEventArgs(state_controller, args.Animator, args.AnimatorStateInfo, args.LayerIndex));

            StateEventInfoQueue.Enqueue(info);
        }
예제 #2
0
        public void OnStateMachineControllerExit(object sender, StateMachineControllerEventArgs args)
        {
            var state_controller = (IStateController)sender;

            ActiveStateControllersSet.Remove(state_controller);
            var info = new ManagedStateEventInfo <ManagedStateMachineEventArgs>(
                ManagedStateEventType.StateMachineExit,
                state_controller.OnManagedStateMachineVerifyExit,
                state_controller.OnManagedStateMachineExit,
                AnyStateMachineExit.Invoke,
                new ManagedStateMachineEventArgs(state_controller, args.Animator, args.StateMachinePathHash));

            StateEventInfoQueue.Enqueue(info);
        }
예제 #3
0
        public void OnStateControllerEntry(object sender, StateControllerEventArgs args)
        {
            var state_controller = (IStateController)sender;

            ActiveStateControllersSet.Add(state_controller);

            var info = new ManagedStateEventInfo <ManagedStateEventArgs>(
                ManagedStateEventType.StateEntry,
                state_controller.OnManagedStateVerifyEnter,
                state_controller.OnManagedStateEnter,
                AnyStateEntry.Invoke,
                new ManagedStateEventArgs(state_controller, args.Animator, args.AnimatorStateInfo, args.LayerIndex));

            StateEventInfoQueue.Enqueue(info);
        }
예제 #4
0
        protected void SafelyProcessEventQueue()
        {
            IEnumerable <IManagedStateEventInfo> verified_infos;

            try
            {
                verified_infos =
                    GetVerifiedStateEventInfos(StateEventInfoQueue)
                    .ToArray();
            }
            catch (Exception ex)
            {
                Animator.Play(LastGoodStatePathHash);
                StateEventInfoQueue.Clear();
                throw ex;
            }

            try
            {
                // If any exceptions are thrown here, we will be in an unknown state

                // Process will perform the managed actions of the state controller
                ProcessStateEventInfos(verified_infos);

                // The processing succeeded and the last good state should be the current state
                // TODO: specify layer index?
                var animator_state_info = Animator.GetCurrentAnimatorStateInfo(0);
                LastGoodStatePathHash = animator_state_info.fullPathHash;
            }
            catch (Exception ex)
            {
                // Last ditch efforts
                Debug.LogError("CRITICAL ERROR");
                for (var i = 0; i < SceneManager.sceneCount; i++)
#pragma warning disable CS0618 // Type or member is obsolete
                {
                    SceneManager.UnloadScene(i);
                }
#pragma warning restore CS0618 // Type or member is obsolete
                throw ex;
            }
        }