protected IEnumerator LoadingAdditiveAsync(string subScene, bool inStack, OnAsyncLoadingProgress onAsyncLoadingProgress) { //TODO 6 hacemos la carga aditiva sobre la variale op. m_numSubSceneLoading++; AsyncOperation op = SceneManager.LoadSceneAsync(subScene, LoadSceneMode.Additive); do { if (onAsyncLoadingProgress != null) { onAsyncLoadingProgress(op.progress, op.isDone); } //TODO 7 yield return WaitForEndOfFrame bloquea la corrutina hasta el siguiente frame yield return(new WaitForEndOfFrame()); } while (!op.isDone); if (inStack) { StoreLevelInfoInStack(subScene); } else { StoreSubSceneInCurrentScene(subScene); } m_numSubSceneLoading--; yield return(null); }
/// <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 IEnumerator LoadingAsync(string sceneName, OnAsyncLoadingProgress onAsyncLoadingProgress) { //B -Evito cargar otras escenas con un semaforo m_justAsyncLoaderMainScene = true; //B -Cargo AsyncOperation op = SceneManager.LoadSceneAsync(sceneName); //Como vamso a hacer un cambio de escena y las escenas actuales va na ser destruidas //no hace falta esperar a cambiar de escena para reescribir nuestra estructura de datos //de la escena. Así evitamos que se inicie antes el start de la siguiente escena que //la actualización de los métodos de las corrutinas. "Recordad el flujo de llamadas!!!!!" //B - Guardo la escena en la pila m_stackScenes.Clear(); StoreLevelInfoInStack(sceneName); do { if (onAsyncLoadingProgress != null) { onAsyncLoadingProgress(op.progress, op.isDone); } yield return(new WaitForEndOfFrame()); } while (!op.isDone); //Acaba cuando la operacion es Done //B - Prosigue el semaforo m_justAsyncLoaderMainScene = false; }
/// <summary> /// Cambia de escena de manera asincrona. /// </summary> /// <param name="sceneToLoad"></param> /// <param name="onAsyncLoadingProgress"></param> public void ChangeAsyncScene(string sceneToLoad, OnAsyncLoadingProgress onAsyncLoadingProgress) { if (m_numSubSceneLoading == 0) { //TODO 3 lanzamos la corrutina LoadingAsync StartCoroutine(LoadingAsync(sceneToLoad, onAsyncLoadingProgress)); } else { m_deferredSceneChange = sceneToLoad; m_deferredCallback = onAsyncLoadingProgress; } }
/// <summary> /// Cambia de escena de manera asincrona. /// </summary> /// <param name="sceneToLoad"></param> /// <param name="onAsyncLoadingProgress"></param> public void ChangeAsyncScene(string sceneToLoad, OnAsyncLoadingProgress onAsyncLoadingProgress) { //B- Me protego de cargas aditivas para hacer la carga asyncrona, sino me lo apunto if (m_numSubSceneLoading == 0) { //TODO 3 lanzamos la corrutina LoadingAsync StartCoroutine(LoadingAsync(sceneToLoad, onAsyncLoadingProgress)); } else { m_deferredSceneChange = sceneToLoad; m_deferredCallback = onAsyncLoadingProgress; } }
/******** 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); } } } }