Aprendizaje de Unity Framework: administrador de cambio de escena

escena de actividad

Los objetos del juego instanciados mediante scripts se generan en la escena activa.

¿Qué escena es la escena activa? El palco actual utilizará el palco de esa escena.

Sólo una escena puede ser la escena activa.

Haga clic derecho en una escena en la Jerarquía y haga clic en "Establecer escena activa" para configurar manualmente esta escena como escena activa. También puede utilizar el método SceneManager.SetActiveScene para establecer una escena cargada como escena activa.

Carga asincrónica

El código relacionado con AsyncOperation debe escribirse en una corrutina.

Nombre del objeto AsyncOperation = SceneManager.LoadSceneAsync (nombre de la escena de cadena)
activa la carga asincrónica de escenas y almacena información de carga asincrónica en objetos AsyncOperation.

El tipo AsyncOperation object.allowSceneActivation
devuelve un tipo bool, que indica si se permite que la escena se active inmediatamente después de cargarla.
Un valor de verdadero significa que una vez que la escena se carga de forma asincrónica, la escena se activará inmediatamente.
Un valor de falso significa que la escena no se activará incluso si la escena está cargada. La escena no se activará hasta que el valor de esta variable se cambie a verdadero nuevamente usando código.

El tipo de operación AsyncOperation object.progress
devuelve un tipo flotante, que va de 0 a 1. Indica el progreso de la carga asincrónica, comenzando con 0 y completando con 1.
Nota: Cuando el valor de la variable AsyncOperation .allowSceneActivation es falso, el valor de este parámetro se quedará estancado en 0,9 como máximo hasta que el valor de la variable AsyncOperation .allowSceneActivation se vuelve verdadero. Esto El valor del parámetro se convertirá en 1

El tipo de operación AsyncOperation object.isDone
devuelve el tipo bool. Indica si se completó la carga asincrónica. El valor es verdadero si está completo, falso si no está completo.
Cuando el valor del objeto de tipo AsyncOperation.progress es 1, el valor de esta variable es verdadero en este momento, pero esto activará una nueva escena. Generalmente es difícil observar que el objeto de tipo AsyncOperation.isDone es verdadero.

El tipo de operación asincrónica object.priority
devuelve el tipo int, que se utiliza para establecer la prioridad de las operaciones asincrónicas.
Cuando se ponen en cola varias operaciones asincrónicas, la operación asincrónica con mayor prioridad se ejecutará primero. Pero si la operación asincrónica se inicia en un subproceso en segundo plano, cambiar la prioridad no tiene ningún efecto.

AsyncOperation.completed
es un evento de acción con un parámetro AsyncOperation. El parámetro AsyncOperation almacena la información de esta carga asincrónica.
Cuando se completa la carga asincrónica, es decir, cuando el valor del tipo AsyncOperation object.isDone es verdadero, este evento se ejecutará una vez.
 

Código LoadSceneManager

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.Events;

/// <summary>
/// 切换场景的管理器
/// </summary>
public class LoadSceneManager : SingletonPatternBase<LoadSceneManager>
{
    /// <summary>
    /// 重新切换当前场景
    /// </summary>
    public void LoadActiveScene()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }

    /// <summary>
    /// 切换到下一个场景,是否场景循环,最后一个场景切换是切换为第一个场景
    /// </summary>
    public void LoadNextScene(bool isCyclical=false)
    {
        int buildIndex = SceneManager.GetActiveScene().buildIndex + 1;

        //检测要切换的新场景的下标是否越界     这个参数的意思是BuildSettings中的场景总数
        if (buildIndex > SceneManager.sceneCountInBuildSettings-1)
        {
            if (isCyclical)
                buildIndex = 0;
            else
            {
                Debug.LogWarning($"加载场景失败!要加载的场景的索引是{buildIndex},越界了");
                return;
            }
        }

        SceneManager.LoadScene(buildIndex);
    }

    /// <summary>
    /// 加载上一个场景,包括可选择的场景循环功能
    /// </summary>
    public void LoadPreviousScene(bool isCyslical=false)
    {
        int buildIndex = SceneManager.GetActiveScene().buildIndex - 1;

        if (buildIndex < 0)
        {
            if (isCyslical)
            {
                buildIndex = SceneManager.sceneCountInBuildSettings - 1;
            }
            else
            {
                Debug.LogWarning($"加载场景失败!要加载的场景索引是{buildIndex},越界了!");
                return;
            }
        }

        SceneManager.LoadScene(buildIndex);
    }

    /// <summary>
    /// 异步加载场景  根据名字来切换场景
    /// </summary>
    public void LoadSceneAsync(string sceneName, UnityAction<float> loading = null,
        UnityAction<AsyncOperation> completed = null, bool setActiveAfterCompleted = true, LoadSceneMode mode = LoadSceneMode.Single)
    {
        MonoManager.Instance.StartCoroutine(LoadSceneCoroutine(sceneName, loading, completed, setActiveAfterCompleted, mode));
    }

    IEnumerator LoadSceneCoroutine(string sceneName, UnityAction<float> loading = null,
        UnityAction<AsyncOperation> completed = null, bool setActiveAfterCompleted = true, LoadSceneMode mode = LoadSceneMode.Single)
    {
        //开始加载资源
        AsyncOperation asyncOperation = SceneManager.LoadSceneAsync(sceneName, mode);

        asyncOperation.allowSceneActivation = false;  //资源加载最多到0.9

        //等待资源加载完毕
        while (asyncOperation.progress < 0.9f)
        {
            loading?.Invoke(asyncOperation.progress);
            yield return null;
        }

        //当asyncOperation.allowSceneActivation 为false,则asyncOperation.Progress最多只能到达0.9
        //我们人为把它们凑成1,可以方便外部进度条的显示
        loading?.Invoke(1);

        asyncOperation.allowSceneActivation = setActiveAfterCompleted;

        //加载资源完毕后执行的逻辑
        completed?.Invoke(asyncOperation);
    }

    /// <summary>
    /// 异步加载场景 根据索引来切换场景
    /// </summary>
    public void LoadSceneAsync(int sceneIndex,UnityAction<float>loading=null, 
        UnityAction completed = null,bool setActiveAfterCompleted=true, LoadSceneMode mode = LoadSceneMode.Single)
    {
        MonoManager.Instance.StartCoroutine(LoadSceneCoroutine(sceneIndex,loading, completed,setActiveAfterCompleted, mode));
    }

    IEnumerator LoadSceneCoroutine(int sceneIndex, UnityAction<float> loading = null,
        UnityAction completed = null, bool setActiveAfterCompleted = true, LoadSceneMode mode = LoadSceneMode.Single)
    {
        //开始加载资源
        AsyncOperation asyncOperation = SceneManager.LoadSceneAsync(sceneIndex, mode);

        asyncOperation.allowSceneActivation = false;  //资源加载最多到0.9

        //等待资源加载完毕
        while (asyncOperation.progress < 0.9f)
        {
            loading?.Invoke(asyncOperation.progress);
            yield return null;
        }

        //当asyncOperation.allowSceneActivation 为false,则asyncOperation.Progress最多只能到达0.9
        //我们人为把它们凑成1,可以方便外部进度条的显示
        loading?.Invoke(1);

        asyncOperation.allowSceneActivation = setActiveAfterCompleted;

        //加载资源完毕后执行的逻辑
        completed?.Invoke();
    }


}

guión de prueba

[MenuItem("我的菜单/同步切换场景/重新切换到上一个场景")]
    static void Method3()
    {
        LoadSceneManager.Instance.LoadPreviousScene();
    }

    [MenuItem("我的菜单/异步切换场景/重新切换到场景1")]
    static void Method4()
    {
        LoadSceneManager.Instance.LoadSceneAsync("New Scene 1", (obj) =>
         {
             Debug.Log("加载进度是:" + obj * 100 + "%");
         }, (obj) =>
         {
             Debug.Log("加载完成了!");
         });
    }

Clase de escena de Unity (clase de escena)

Los objetos de la clase Escena se utilizan para almacenar información de la escena.

El tipo de escena object.buildIndex
devuelve un tipo int, que indica el índice de la escena en la ventana Configuración de compilación.
Si la escena no es válida, el valor de esta variable es -1.
Si la escena es una escena cargada a través de AssetBundle, el valor de esta variable también es -1.

El tipo de escena object.isDirty
devuelve el tipo bool, que indica si la escena ha sido modificada.
Cuando modificamos una escena en modo editor pero no la guardamos, el valor de esta variable es verdadero. Una vez guardada la escena, el valor de esta variable es falso

El tipo de escena object.isLoaded
devuelve verdadero si la escena se ha cargado. Si la escena no se ha cargado o no se ha cargado, devuelve falso

El tipo de escena object.name
devuelve un tipo de cadena, que indica el nombre de la escena, el final no contiene el sufijo .unity,
que es su nombre en la ventana del Proyecto.
Nota: La escena debe haberse cargado para que esta variable devuelva correctamente su nombre de escena. Si la escena no se ha cargado o no se ha cargado, el valor devuelto es "Nulo"

Escena object.path
devuelve un tipo de cadena, que indica la ruta de la escena, con el sufijo .unity al final.
Por ejemplo:
Assets/AssetBundleAssets/Scenes/TestScenes/Test.unity

El tipo de escena object.rootCount
devuelve un tipo int, que indica el número total de componentes Transform en todos los objetos raíz del juego en la escena.

Objeto de tipo de escena. GetRootGameObjects
devuelve el tipo GameObject [], que representa todos los objetos raíz del juego en la escena.
También se incluirá el objeto raíz oculto del juego, pero no se incluirá el objeto raíz del juego DontDestoryOnLoad.

Tipo de escena object.IsValid
Si existe una escena, es una escena válida y el valor de esta variable es verdadero.
Si no existe una escena, es una escena no válida y el valor de esta variable es falso.
Nota: De EditorSceneManager.OpenScene El valor de IsValid de la escena devuelta es falso

El operador != se puede utilizar entre dos objetos de escena,
si las dos escenas son diferentes, devuelve verdadero, de lo contrario devuelve falso.

El operador == se puede utilizar entre dos objetos de escena,
si las dos escenas son iguales, devuelve verdadero, de lo contrario devuelve falso.

Clase Unity SceneManager (administrador de escenas, utilizada para cargar escenas y cambiar escenas)

Primero arrastre las escenas que desea saltar a Configuración de creación de archivos

Primero se debe introducir el espacio de nombres: usando UnityEngine.SceneManagement;

SceneManager.sceneCount
El número de escenas cargadas actualmente.

SceneManager.sceneCountInBuildSettings
El número de escenas que se han agregado a la ventana Configuración de compilación.
Si está en modo editor, también se incluirá la escena que se abrió antes de ingresar al modo de reproducción. Si no se arrastra manualmente a la ventana Configuración de compilación, también se indexa en la ventana Configuración de compilación, pero no podemos verla. Este índice es mayor que el valor máximo visible de 1.

SceneManager.CreateScene(int scene name)
crea una escena vacía, que se superpondrá a la escena actual.
Si la escena creada tiene un nombre duplicado, se informará un error.
El nombre de la escena se puede ver en la ventana Jerarquía.
Si desea crear una escena mientras edita, por ejemplo al crear un script o herramienta de edición, debe usar EditorSceneManager.NewScene

SceneManager.CreateScene(nombre de la escena de cadena, CreateSceneParameters varios parámetros para crear la escena)
crea una escena vacía, que se superpondrá a la escena actual.
Si la escena creada tiene un nombre duplicado, se informará un error.
El nombre de la escena se puede ver en la ventana Jerarquía.
Si desea crear una escena mientras edita, por ejemplo al crear un script o herramienta de edición, debe usar EditorSceneManager.NewScene

SceneManager.GetActiveScene()
devuelve un objeto Escena, que representa información sobre la escena actual.

SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
utilice la sincronización para cambiar a la escena actual nuevamente.

SceneManager.GetActiveScene().buildIndex+1 representa el índice de la siguiente escena en la ventana Configuración de compilación.

SceneManager.GetActiveScene().nombre
tipo de cadena. Indica el nombre de la escena actual. Se puede utilizar con SceneManager.LoadScene para recargar la escena actual.

SceneManager.GetSceneAt(int index)
devuelve información sobre la escena en el índice especificado en la lista de escenas cargadas actualmente.
El índice debe ser mayor o igual a 0 y el mínimo es 0. Si es un número negativo o el índice está fuera de los límites, se informará un error.

SceneManager.GetSceneByBuildIndex (índice int de la escena en la ventana Configuración de compilación)
devuelve la información de la escena en la Configuración de compilación según el índice pasado.
La escena debe estar en la ventana Configuración de compilación y actualmente cargada para que se devuelva su información. De lo contrario, se devolverá un objeto Escena no válido.
El índice debe ser mayor o igual a 0 y el mínimo es 0. Si es un número negativo o el índice está fuera de los límites, se informará un error.

SceneManager.GetSceneByName(nombre de escena de cadena)
busca la escena con el nombre de escena especificado en la escena cargada actualmente.
Si se encuentra, se devuelve un objeto Escena, que representa la información de esta escena. Si no se encuentra, se devuelve un objeto de escena no válido.
El nombre de la escena puede ser la última parte del nombre que se muestra en la ventana Configuración de compilación, en cuyo caso se devolverá la primera información de la escena coincidente.
El nombre de la escena también puede ser la ruta que se muestra en la ventana Configuración de compilación, en cuyo caso se devolverá la información exacta de la escena coincidente.
Los nombres de las escenas no distinguen entre mayúsculas y minúsculas.
Los nombres de las escenas no deben contener la extensión .unity.

SceneManager.GetSceneByPath (ruta de escena de cadena)
encuentra la escena con la ruta de recursos especificada en la escena cargada actualmente.
Si se encuentra, se devuelve un objeto Escena, que representa la información de esta escena. Si no se encuentra, se devuelve un objeto de escena no válido.
La ruta a la escena debe ser relativa a la carpeta del proyecto, por ejemplo: "Assets/MyScenes/MyScene.unity"

SceneManager.LoadScene (índice int de la escena en la ventana Configuración de compilación, modo LoadSceneMode para cargar la escena);
        carga sincrónicamente la escena en el índice especificado.
        El primer parámetro puede ser de tipo cadena, de modo que la escena especificada se cargará según el nombre de la escena o la ruta de la escena. En este momento, la escena con este nombre se coloca en la ventana Configuración de compilación de antemano o se cargó usando AssetBundle antes, para que este método sea efectivo. Si no hay ninguno, se informará un error. Nota: El nombre de la escena no contiene el sufijo .unity. Además, los nombres de las escenas no deben tener el mismo nombre. Si los nombres de las escenas tienen el mismo nombre, se cargará la primera escena que coincida. Puede usar la ruta de la escena, por ejemplo: Assets/AssetBundleAssets/Scenes/TestScenes/Scene1.unity.
        Si usa LoadSceneMode.Single como segundo parámetro, cambiará automáticamente a la escena después de la carga. La escena original será desinstalada. Esto se utiliza de forma predeterminada.
        Si se utiliza LoadSceneMode.Additive como segundo parámetro, la escena se superpondrá a la escena original después de la carga. La escena original no se desinstalará y la escena activa seguirá siendo la escena original.
        El uso de este método para cargar una escena no se cargará inmediatamente, sino que comenzará a cargarse en el siguiente fotograma. Y como este método es sincrónico, pueden producirse retrasos. Se recomienda utilizar el método LoadSceneAsync de carga asincrónica.

SceneManager.LoadSceneAsync (int el índice de la escena en la ventana Configuración de compilación, LoadSceneMode el modo de cargar la escena);
        carga asincrónicamente la escena en el índice especificado.
        El primer parámetro puede ser de tipo cadena, de modo que la escena especificada se cargará según el nombre de la escena o la ruta de la escena. En este momento, la escena con este nombre se coloca en la ventana Configuración de compilación de antemano o se cargó usando AssetBundle antes, para que este método sea efectivo. Si no hay ninguno, se informará un error. Nota: El nombre de la escena no contiene el sufijo .unity. Además, los nombres de las escenas no deben tener el mismo nombre. Si los nombres de las escenas tienen el mismo nombre, se cargará la primera escena que coincida. Puede usar la ruta de la escena, por ejemplo: Assets/AssetBundleAssets/Scenes/TestScenes/Scene1.unity.
        Si usa LoadSceneMode.Single como segundo parámetro, puede cambiar a la escena después de cargarla y la escena original se descargará. Esto se utiliza de forma predeterminada.
        Si se utiliza LoadSceneMode.Additive como segundo parámetro, la escena se puede superponer a la escena original después de la carga. La escena original no se desinstalará y la escena activa seguirá siendo la escena original.
        Usar este método para cargar una escena no congelará el juego. A menudo se usa junto con la barra de progreso en la escena. Puedes controlar el avance de la barra de progreso mientras se carga la escena.
        El tipo de valor de retorno de este método es el tipo AsyncOperation. Puede juzgar si la carga asincrónica se completa en función del objeto de este tipo. Para obtener más información, consulte la clase AsyncOperation.

SceneManager.MergeScenes (Escena escena 1, Escena escena 2)
transferirá todos los objetos del juego en la escena 1 a la escena 2, y la escena 1 se descargará.
Generalmente, este método solo se puede usar cuando se usa LoadSceneMode.Additive para cargar la escena.
Tanto la escena 1 como la escena 2 deben ser escenas cargadas.
Si la escena original 1 es la escena activa, luego de desinstalarla, la primera escena en la parte superior de la ventana Jerarquía se convertirá en la escena activa.
Si la escena original 1 no es la escena activa, la escena activa no cambiará después de desinstalarla.

SceneManager.MoveGameObjectToScene(GameObject es el objeto del juego que se va a mover, Scene se mueve a la escena)
mueve un objeto del juego desde la escena donde se encuentra hasta la escena de destino.
Generalmente, este método solo se puede usar cuando se usa LoadSceneMode.Additive para cargar la escena.
La escena a la que desea moverse debe estar cargada.
Si el objeto del juego que se va a mover es nulo, este método no tiene ningún efecto.
Si la escena a la que se mueve no se ha cargado o no es válida, se informará un error.

SceneManager.SetActiveScene (nombre de la escena)
establece la escena especificada como escena activa.

SceneManager.UnloadSceneAsync (índice de escena int en la ventana Configuración de compilación)
SceneManager.UnloadSceneAsync (nombre de escena de cadena o ruta de escena)
SceneManager.UnloadSceneAsync (objeto de escena de escena)
SceneManager.UnloadSceneAsync (índice de escena int en la ventana Configuración de compilación, UnloadSceneOptions descarga las opciones de escena )
SceneManager.UnloadSceneAsync (cadena de nombre de escena o ruta de escena, opciones UnloadSceneOptions para descargar la escena)
SceneManager.UnloadSceneAsync (objeto de escena de escena, opciones UnloadSceneOptions para descargar la escena)
Destruye la escena especificada y todos los objetos del juego en esta escena.
Este método solo es válido para escenas cargadas usando LoadSceneMode.Additive. Si solo hay una escena en el juego actual, este método no es válido y la consola informará una advertencia amarilla.
Este método no descargará los recursos de la escena en la memoria. Si desea liberar los recursos, debe llamar al método Resources.UnloadUnusedAssets después de llamar a este método. El
tipo de valor de retorno es el tipo AsyncOperation. Puede usar este objeto para determine si la operación asincrónica se completa.

Evento de tipo SceneManager.activeSceneChanged
UnityAction<Scene,Scene>.
Este evento se ejecutará una vez cuando cambie la escena activa.
El primer parámetro representa la escena de actividad original y el segundo parámetro representa la escena de actividad posterior.

Evento de tipo SceneManager.sceneLoaded
UnityAction<Scene,LoadSceneMode>.
Este evento se ejecutará cada vez que se cargue una nueva escena.
El primer parámetro indica la nueva escena que se cargará y el segundo parámetro indica el modo de carga de esta escena.

Evento de tipo SceneManager.sceneUnloaded
UnityAction<Scene>.
Este evento se ejecutará cada vez que se descargue una escena.
El parámetro representa el objeto de escena descargado.

Supongo que te gusta

Origin blog.csdn.net/zaizai1007/article/details/132377762
Recomendado
Clasificación