private IEnumerator SwitchToSceneCoroutine(string subSceneName, bool skipFadeOut, bool skipLoadingScreen, bool unloadOtherScenes, bool fromView, IProgress prog)
        {
            var scenePath = GetScenePathFromName(subSceneName);

            if (scenePath == null)
            {
                ScreenDebugger.Print($"Couldn't find scene: {subSceneName}");
            }
            else
            {
                if (unloadOtherScenes)
                {
                    yield return(ExitAllSubScenesExcept(GetOpenSubScenes(scenePath), scenePath));
                }

                var showFader = !skipFadeOut &&
                                fader != null &&
                                fader.CanEnter;

                if (showFader && fromView)
                {
                    showFader &= !IsSceneLoaded(scenePath);
                    if (!showFader)
                    {
                        var scene     = SceneManager.GetSceneByPath(scenePath);
                        var subScenes = scene.FindAll <SubSceneController>();
                        foreach (var subScene in subScenes)
                        {
                            showFader |= subScene.IsExited || !subScene.isActiveAndEnabled;
                        }
                    }
                }

                if (showFader)
                {
                    Resources.UnloadUnusedAssets();

                    yield return(fader.EnterAsync().AsCoroutine());

                    if (input != null)
                    {
                        input.paused = true;
                    }

                    if (loadingBar != null && !skipLoadingScreen)
                    {
                        loadingBar.Activate();
                        prog.Report(0, subSceneName);
                    }
                }

                if (unloadOtherScenes)
                {
                    foreach (var subScene in GetOpenSubScenes(scenePath))
                    {
                        if (subScene.unloadSceneOnExit)
                        {
                            var scene = subScene.gameObject.scene;
                            yield return(SceneManager.UnloadSceneAsync(scene).AsCoroutine());
                        }
                    }
                }

                yield return(LoadScenePathCoroutine(scenePath, prog));

                for (var i = 1; i < SceneManager.sceneCount; ++i)
                {
                    var scene = SceneManager.GetSceneAt(i);

#if UNITY_MODULES_UI
                    var canvases = scene.FindAll <Canvas>((c) =>
                                                          c.renderMode == RenderMode.WorldSpace &&
                                                          (c.worldCamera == null ||
                                                           c.worldCamera != DisplayManager.MainCamera));
                    foreach (var canvas in canvases)
                    {
                        canvas.worldCamera = DisplayManager.EventCamera;
                    }
#endif

#if UNITY_MODULES_AUDIO
                    var audioSources = scene.FindAll <AudioSource>((a) => a.spatialize);
                    foreach (var audioSource in audioSources)
                    {
                        if (audioSource.spatialize)
                        {
                            interaction.Spatialize(audioSource);
                        }
                        else
                        {
                            interaction.SetDefaultMixerGroup(audioSource);
                        }
                    }
#endif
                }

                if (loadingBar != null)
                {
                    var end = DateTime.Now.AddSeconds(1);
                    while (DateTime.Now < end || loadingBar.Progress >= 1)
                    {
                        yield return(null);
                    }
                    loadingBar.Deactivate();
                }

                if (splash != null)
                {
                    splash.Deactivate();
                }

                if (fader != null &&
                    fader.CanExit)
                {
                    if (input != null)
                    {
                        input.paused = false;
                    }

                    if (skipLoadingScreen)
                    {
                        fader.SkipExit();
                    }
                    else
                    {
                        yield return(fader.ExitAsync().AsCoroutine());
                    }
                }
            }
        }