public static IEnumerator Run(StateMachine stateMachine, Timeline timeline)
            {
#if UNITY_EDITOR && DEBUG
                TimelineStateMachineDebug.OnTimelineStateStarted(stateMachine, null, null);
#endif
                return(PerformState(stateMachine, null, timeline));
            }
                private void UpdateInPlayMode()
                {
                    _debugging = false;

                    if (_editorPrefs._debug)
                    {
                        StateMachine stateMachine = _editorPrefs._debugObject.GetComponent();
                        TimelineStateMachineDebug.StateInfo stateInfo = TimelineStateMachineDebug.GetStateInfo(stateMachine != null ? stateMachine.gameObject : null);

                        if (stateInfo != null)
                        {
                            _debugging = true;

                            if (_currentFileName != stateInfo._fileName && stateInfo._fileName != null)
                            {
                                _currentFileName = stateInfo._fileName;
                                SetStateMachine(stateInfo._stateMachine);
                                _stateEditor.SetTimeline(null);
                            }

                            switch (_currentMode)
                            {
                            case eMode.ViewingStateMachine:
                            {
                                if (_playModeHighlightedState != stateInfo._state)
                                {
                                    GetEditorWindow().DoRepaint();
                                }

                                _playModeHighlightedState = stateInfo._state;

                                if (_editorPrefs._debugLockFocus)
                                {
                                    CenterCameraOn(GetTimelineStateGUI(_playModeHighlightedState._stateId));
                                }
                            }
                            break;

                            case eMode.ViewingState:
                            {
                                if (stateInfo._state._stateId != _editedState.GetStateId())
                                {
                                    _editedState = GetTimelineStateGUI(stateInfo._state._stateId);
                                    _stateEditor.SetTimeline(stateInfo._state._timeline);
                                }

                                _stateEditor.SetPlayModeCursorTime(stateInfo._time);
                                GetEditorWindow().DoRepaint();
                            }
                            break;
                            }
                        }
                    }
                }
            public static IEnumerator Run(StateMachine stateMachine, TimelineStateRefProperty stateRef, GameObject sourceObject = null)
            {
                TimelineState state = stateRef.LoadTimelineState(sourceObject != null ? sourceObject : stateMachine.gameObject);

                if (state != null)
                {
#if UNITY_EDITOR && DEBUG
                    string debugFileName = AssetDatabase.GetAssetPath(stateRef.GetFile());
                    TimelineStateMachineDebug.OnTimelineStateStarted(stateMachine, state, debugFileName);
#endif
                    return(PerformState(stateMachine, state, state._timeline));
                }

                return(null);
            }
            public static IEnumerator Run(StateMachine stateMachine, TimelineStateRef stateRef, GameObject sourceObject = null)
            {
                TimelineState state = stateRef.GetTimelineState(sourceObject != null ? sourceObject : stateMachine.gameObject);

                if (state != null)
                {
#if UNITY_EDITOR && DEBUG
                    string debugFileName = stateRef._file._filePath;
                    TimelineStateMachineDebug.OnTimelineStateStarted(stateMachine, state, debugFileName);
#endif
                    return(PerformState(stateMachine, state, state._timeline));
                }

                return(null);
            }
            private static IEnumerator PerformState(StateMachine stateMachine, TimelineState state, Timeline timeline)
            {
                if (timeline != null && timeline._events.Length > 0)
                {
                    ITimelineStateMachineTimer timer = TimelineStateMachine.GetTimer(stateMachine.gameObject);

                    float        currentTime      = 0.0f;
                    List <Event> nonInstantEvents = new List <Event>();

                    int   eventIndex   = 0;
                    Event currentEvent = timeline._events[eventIndex];

                    while (currentEvent != null || nonInstantEvents.Count > 0)
                    {
                        IStateMachineEvent currentStateMachineEvent = currentEvent as IStateMachineEvent;

                        if (currentStateMachineEvent == null && currentEvent != null)
                        {
                            throw new System.Exception("Event doesn't implement IStateMachineEvent");
                        }

                        float nextEventTime = currentEvent != null ? timeline._events[eventIndex].GetTime() : 0.0f;

                        //Wait until event time
                        while (currentTime < nextEventTime || (currentEvent == null && nonInstantEvents.Count > 0))
                        {
                            currentTime += timer.GetDeltaTime();
#if DEBUG
                            TimelineStateMachineDebug.OnTimelineStateTimeProgress(stateMachine, state, currentTime);
#endif

                            //Updated non instant events, if any now wants to exit the state then break out of coroutine
                            if (UpdateNonInstantEvents(stateMachine, ref nonInstantEvents, currentTime))
                            {
                                EndNonInstantEvents(stateMachine, ref nonInstantEvents);
                                yield break;
                            }

                            yield return(null);
                        }

                        if (currentEvent == null)
                        {
                            break;
                        }

                        //Trigger event
                        eEventTriggerReturn status = currentStateMachineEvent.Trigger(stateMachine);

                        switch (status)
                        {
                        case eEventTriggerReturn.EventFinished:
                            //Do nothing, just move on to next event
                            break;

                        case eEventTriggerReturn.EventFinishedExitState:
                            //Exit state so break out of coroutine
                            EndNonInstantEvents(stateMachine, ref nonInstantEvents);
                            yield break;

                        case eEventTriggerReturn.EventOngoing:
                            //Track timed event, move on to next event
                            nonInstantEvents.Add(currentEvent);
                            break;
                        }

                        //Get next
                        currentEvent = ++eventIndex < timeline._events.Length ? timeline._events[eventIndex] : null;
                    }
                }

#if DEBUG
                TimelineStateMachineDebug.OnTimelineStateStoped(stateMachine);
#endif

                yield break;
            }