IEnumerator Start() { var obj = Instantiate(m_transitionPrefab); m_transition = obj.GetComponent <Transition>(); DontDestroyOnLoad(m_transition); while (true) { if (m_currentState != null) { m_currentState.Update(); } if (m_queuedState != State.None) { var prevState = CurrentState; var nextState = m_queuedState; EventManager.Instance.SendEvent(new EventChangeGameState(prevState, nextState)); // Fade out previous state //yield return m_transition.StartCoroutine(m_transition.In()); float start = Time.time; // Switch state if (m_currentState != null) { m_currentState.End(nextState); } m_currentState = CreateState(nextState); m_currentState.Begin(prevState); // Take the hit of some expensive Start frames // for (int i = 0; i < 5; ++i) // yield return null; //float minimumSplashVisibleDuration = (nextState == State.Game || prevState == State.Game) ? 1.0f : 0.0f; //while (Time.time < start + minimumSplashVisibleDuration) // yield return null; // Fade in next state // yield return m_transition.StartCoroutine(m_transition.Out()); m_queuedState = State.None; } // Wait one frame until next "Update" yield return(null); } }