private IEnumerator LoadAdditiveScene(SceneIndex scene, SceneModel model) { OnLoadingStart?.Invoke(); IsLoading = true; AsyncOperation loadSceneJob = SceneManager.LoadSceneAsync(scene.ToString(), LoadSceneMode.Additive); while (!loadSceneJob.isDone) { yield return(null); // Callback to update based on the async task progress OnLoadingUpdate?.Invoke(loadSceneJob.progress); } // Scene was done loading Scene loadedScene = SceneManager.GetSceneByName(scene.ToString()); if (loadedScene.isLoaded) { SceneManager.MergeScenes(loadedScene, SceneManager.GetActiveScene()); bool controllerFound = false; // Get the scene object to initialize the scene using the ISceneController interface GameObject[] rootObjects = loadedScene.GetRootGameObjects(); foreach (GameObject rootObject in rootObjects) { // Try to get the scene controller so we can initialize the scene SceneController <SceneModel> sceneController = rootObject.GetComponent <SceneController <SceneModel> >(); // This object didn't have the scene controller if (sceneController == null) { continue; } sceneController.BaseModel = model; LoadedScene managedLoadedScene = new LoadedScene(sceneController, model, rootObject, scene); _loadedScenes.Add(managedLoadedScene); yield return(sceneController.Initialization()); sceneController.AfterInitialization(); controllerFound = true; } if (!controllerFound) { Debug.LogError("[SceneTransitionManager] Could not find any object with component ISceneController in scene: " + loadedScene.name); } } OnLoadingFinished?.Invoke(); IsLoading = false; }
private IEnumerator LoadMainScene(SceneIndex scene, SceneModel model) { OnLoadingStart?.Invoke(); IsLoading = true; // Make sure to clean up the current active scene before destroying it if (_activeScene != null) { _activeScene.Controller.BeforeDestroy(); } // Start the scene loading asyncronous operation AsyncOperation loadSceneJob = SceneManager.LoadSceneAsync(scene.ToString()); while (!loadSceneJob.isDone) { yield return(null); // Callback to update based on the async task progress OnLoadingUpdate?.Invoke(loadSceneJob.progress); } _loadedScenes.Clear(); GC.Collect(); Scene loadedScene = SceneManager.GetSceneByName(scene.ToString()); if (loadedScene.isLoaded) { bool controllerFound = false; // Get the scene object to initialize the scene using the ISceneController interface GameObject[] rootObjects = loadedScene.GetRootGameObjects(); foreach (GameObject rootObject in rootObjects) { // Try to get the scene controller so we can initialize the scene ISceneController sceneController = rootObject.GetComponent <ISceneController>(); // This object didn't have the scene controller if (sceneController == null) { continue; } // Create a loaded scene handle LoadedScene managedLoadedScene = new LoadedScene(sceneController, model, rootObject, scene); _loadedScenes.Add(managedLoadedScene); _activeScene = managedLoadedScene; sceneController.BaseModel = model; yield return(sceneController.Initialization()); sceneController.AfterInitialization(); controllerFound = true; } if (!controllerFound) { Debug.LogError("[SceneTransitionManager] Could not find any object with component SceneController in scene: " + loadedScene.name); } } yield return(new WaitForSeconds(1)); OnLoadingFinished?.Invoke(); IsLoading = false; }