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()); } } } }