/// <summary> /// Load the scene. /// </summary> /// <param name="scene">Scene.</param> /// <param name="sceneData">Data.</param> /// <param name="additiveLoadScenes">Additive load scenes.</param> /// <param name="autoTransition">If set to <c>true</c> auto move.</param> public static void LoadScene(EScenes scene, SceneDataPackBase sceneData = null, EScenes[] additiveLoadScenes = null, bool autoTransition = true) { // Send default scene data. if (sceneData == null) { sceneData = new SceneDataPackBase(TransitionManagerInstance.CurrentGameScene, additiveLoadScenes); } TransitionManagerInstance.StartTransition(scene, sceneData, additiveLoadScenes, autoTransition); }
/// <summary> /// Starts the transition. /// </summary> /// <param name="nextScene">Next scene.</param> /// <param name="sceneData">Scene data.</param> /// <param name="additiveLoadScenes">Additive load scenes.</param> /// <param name="autoTransition">If set to <c>true</c> auto transition.</param> public void StartTransition( EScenes nextScene, SceneDataPackBase sceneData, EScenes[] additiveLoadScenes, bool autoTransition ) { if (isRunning) { return; } StartCoroutine(TransitionCoroutine(nextScene, sceneData, additiveLoadScenes, autoTransition)); }
/// <summary> /// Transition coroutine. /// </summary> /// <returns>The coroutine.</returns> /// <param name="nextScene">Next scene.</param> /// <param name="sceneData">Scene data.</param> /// <param name="additiveLoadScenes">Additive load scenes.</param> /// <param name="autoTransition">If set to <c>true</c> auto transition.</param> private IEnumerator TransitionCoroutine( EScenes nextScene, SceneDataPackBase sceneData, EScenes[] additiveLoadScenes, bool autoTransition ) { isRunning = true; CanEndTransition.Value = autoTransition; if (fade == null) { Initialize(); yield return(null); } // Start transition. fade.FadeIn(1.0f); // Wait for transition animation. yield return(onTransitionFinishedInternal.FirstOrDefault().ToYieldInstruction()); // Set data what gave by previous scene. SceneLoader.PreviousSceneData = sceneData; // Load main scene as single scene. yield return(SceneManager.LoadSceneAsync(nextScene.ToString(), LoadSceneMode.Single)); // Load sub scenes. if (additiveLoadScenes != null) { yield return(additiveLoadScenes.Select(scene => SceneManager.LoadSceneAsync((int)scene, LoadSceneMode.Additive) .AsObservable()).WhenAll().ToYieldInstruction()); } yield return(null); // Release unused assets memories. Resources.UnloadUnusedAssets(); GC.Collect(); yield return(null); // Set current scene. currentGameScene = nextScene; // Publish notification of scene loaded. onAllSceneLoaded.OnNext(Unit.Default); if (!autoTransition) { // Wait for OpenLoadedNextScene function. yield return(CanEndTransition.FirstOrDefault(x => x).ToYieldInstruction()); } CanEndTransition.Value = false; // Start fadeout animation. fade.FadeOut(1.0f); // Wait for completed to open fade. yield return(onTransitionFinishedInternal.FirstOrDefault().ToYieldInstruction()); // Publish notification of finished scene transition. onTransitionAnimationFinishedSubject.OnNext(Unit.Default); isRunning = false; }