protected IEnumerator Transition(string newSceneName, bool resetInputValues, SceneTransitionDestination.DestinationTag destinationTag, TransitionPoint.TransitionType transitionType = TransitionPoint.TransitionType.DifferentZone)
    {
        m_Transitioning = true;
        PersistentDataManager.SaveAllData();

        if (m_PlayerInput == null)
        {
            m_PlayerInput = FindObjectOfType <PlayerInput>();
        }
        m_PlayerInput.ReleaseControl(resetInputValues);
        yield return(StartCoroutine(ScreenFader.FadeSceneOut(ScreenFader.FadeType.Loading)));

        PersistentDataManager.ClearPersisters();
        yield return(SceneManager.LoadSceneAsync(newSceneName));

        m_PlayerInput = FindObjectOfType <PlayerInput>();
        m_PlayerInput.ReleaseControl(resetInputValues);
        PersistentDataManager.LoadAllData();
        SceneTransitionDestination entrance = GetDestination(destinationTag);

        SetEnteringGameObjectLocation(entrance);
        SetupNewScene(transitionType, entrance);
        if (entrance != null)
        {
            entrance.OnReachDestination.Invoke();
        }
        yield return(StartCoroutine(ScreenFader.FadeSceneIn()));

        m_PlayerInput.GainControl();

        m_Transitioning = false;
    }