/// <summary> /// Cargamos una subscena de forma aditiva. /// </summary> /// <param name="subScene"></param> /// <param name="asyn"></param> public void LoadSubScene(string subScene, bool asyn = false, OnAsyncLoadingProgress onAsyncLoadingProgress = null) { TSceneInfo sceneInfo = m_stackScenes.Peek(); if (!sceneInfo.subScenes.Contains(subScene)) { //Carga de la subscena if (asyn) { //TODO 4 lanzamos la corrutina LoadingAdditiveAsync StartCoroutine(LoadingAdditiveAsync(subScene, false, onAsyncLoadingProgress)); } else { SceneManager.LoadScene(subScene, LoadSceneMode.Additive); StoreSubSceneInCurrentScene(subScene); } } else // Si ya está cargada, como mucho podemos intentar activarla. { Scene scene = SceneManager.GetSceneByName(subScene); if (IsDesactivate(scene)) { Activate(scene, true); } } }
protected void StoreSubSceneInCurrentScene(string subSceneName) { TSceneInfo info = m_stackScenes.Peek(); if (!info.subScenes.Contains(subSceneName)) { info.subScenes.Add(subSceneName); } }
protected TSceneInfo StoreLevelInfoInStack(string levelName) { TSceneInfo info = new TSceneInfo(); info.name = levelName; info.subScenes = new List <string>(); m_stackScenes.Push(info); return(info); }
protected void SuspendScene(TSceneInfo sceneInfo) { foreach (string subScene in sceneInfo.subScenes) { Scene scene = SceneManager.GetSceneByName(subScene); Activate(scene, false); } Scene mainScene = SceneManager.GetSceneByName(sceneInfo.name); Activate(mainScene, false); }
protected void DestroyScene(TSceneInfo sceneInfo) { foreach (string subscenes in sceneInfo.subScenes) { SceneManager.UnloadSceneAsync(subscenes); } if (m_sceneDestroyCallbacks != null) { m_sceneDestroyCallbacks(); } SceneManager.UnloadSceneAsync(sceneInfo.name); /*if (m_sceneDestroyCallbacks != null) * m_sceneDestroyCallbacks();*/ }
protected void BackToLifeScene(TSceneInfo sceneInfo) { foreach (string subScene in sceneInfo.subScenes) { Scene scene = SceneManager.GetSceneByName(subScene); if (IsDesactivate(scene)) { Activate(scene, true); } } Scene mainScene = SceneManager.GetSceneByName(sceneInfo.name); if (IsDesactivate(mainScene)) { Activate(mainScene, true); } }
/******** PILA DE ESCENAS ***********************/ /// <summary> /// Cargamos uan escena de forma aditiva y la apilamos en nuestra pila de escenas, dejando la escena actual desactivada. /// </summary> /// <param name="sceneName"></param> /// <param name="asyn"></param> /// <param name="onAsyncLoadingProgress"></param> public void PushScene(string sceneName, bool asyn = false, OnAsyncLoadingProgress onAsyncLoadingProgress = null) { bool needLoading = true; if (m_stackScenes.Count > 0) { TSceneInfo current = m_stackScenes.Peek(); if (current.name != sceneName) { SuspendScene(current); } else { needLoading = false; Scene scene = SceneManager.GetSceneByName(sceneName); if (IsDesactivate(scene)) { Activate(scene, true); } } } if (needLoading) { Scene scene = SceneManager.GetSceneByName(sceneName); if (scene.buildIndex >= 0 && IsDesactivate(scene)) { Activate(scene, true); StoreLevelInfoInStack(sceneName); } else { if (asyn) { StartCoroutine(LoadingAdditiveAsync(sceneName, true, onAsyncLoadingProgress)); } else { SceneManager.LoadScene(sceneName, LoadSceneMode.Additive); StoreLevelInfoInStack(sceneName); } } } }
/// <summary> /// Descargamos una subscena de la escena principal. /// </summary> /// <param name="subScene"></param> /// <param name="clearSubScene"></param> public void UnloadSubScene(string subScene, bool clearSubScene) { TSceneInfo current = m_stackScenes.Peek(); if (current.subScenes.Contains(subScene)) { if (clearSubScene) { current.subScenes.Remove(subScene); SceneManager.UnloadSceneAsync(subScene); } else { Scene scene = SceneManager.GetSceneByName(subScene); Activate(scene, false); } } //StoreSubSceneInCurrentScene(subScene); }
/// <summary> /// Desapilamos la escena apilada en la cima de la pila. /// </summary> /// <param name="clearCurrentScene"></param> public void PopScene(bool clearCurrentScene) { Debug.Assert(m_stackScenes.Count > 1, "Error, No hay escena a la cual volver"); //TODO 5 desapilamos de la cima de la pila TSceneInfo current = m_stackScenes.Pop(); //NOTA: Puede querer destruirla? en principio si... if (clearCurrentScene) { DestroyScene(current); } else { Scene scene = SceneManager.GetSceneByName(current.name); Activate(scene, false); } TSceneInfo previousScene = m_stackScenes.Peek(); BackToLifeScene(previousScene); }