예제 #1
0
    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);
    }
예제 #2
0
    /// <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);
            }
        }
    }
예제 #3
0
    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;
    }
예제 #4
0
 /// <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;
     }
 }
예제 #5
0
 /// <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;
     }
 }
예제 #6
0
    /******** 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);
                }
            }
        }
    }