Agregar una escena

Actualización de la página :
Fecha de creación de la página :

Entorno de verificación

Windows
  • Ventanas 11
Unity Editor
  • 2020.3.25f1
Paquete del sistema de entrada
  • 1.2.0

Requisitos previos para esta sugerencia

Los siguientes ajustes se han realizado de antemano como premisa para la descripción de este consejo.

Acerca de la adición de una escena

Unity te permite mostrar varias escenas al mismo tiempo. Úsalo cuando simplemente quieras superponer escenas o exportar tus dibujos a una textura diferente.

Esta vez, me gustaría explicar la visualización superpuesta de la escena suponiendo que la pantalla del menú se muestra en primer plano mientras el juego se ejecuta mientras el juego se está ejecutando.

Al mostrar varias escenas, debe tener en cuenta lo siguiente:

  • No debe haber más de un EventSystem
  • No debe haber más de un oyente de audio
  • Tenga cuidado al manipular varias cámaras

Preparar la escena

Esta vez, prepararemos dos escenas. Sea , y SampleSceneParentla escena SampleSceneChild que se mostrará adicionalmente es . El método de preparación de dos escenas es el mismo que los consejos anteriores, así que por favor consúltelos.

Esta vez, crearemos el siguiente diseño. Si hace clic en el botón en la escena principal, no hay ningún problema, excepto agregar la escena secundaria. Y los sprites se colocan para que sea más fácil entender los síntomas que verá más Canvas adelante.

SampleSceneParent

SampleSceneChild

Cuando se muestran varias escenas, el contexto de los objetos depende del "orden de capas" de cada objeto, independientemente de la unidad de escena. Dado que los valores iniciales son todos 0, deje SampleSceneChild Canvas el no y los sprites establecidos en "1".

No olvides establecer las dos escenas en la configuración de compilación.

Procesamiento de escenas

Se procesa en código de la misma manera que cambiar de escena. Esta vez también, se procesa cuando se hace clic en el botón, pero se procesa como una adición en lugar de un interruptor de escena.

El nombre del archivo de script es arbitrario, pero aquí SceneAdd está .

El script tiene este aspecto:

using UnityEngine;
using UnityEngine.SceneManagement;  // 追加

public class SceneAdd : MonoBehaviour
{
  /// <summary>ボタンをクリックしたときに呼ばれます。</summary>
  public void OnClick()
  {
    // 指定したシーンを追加します
    SceneManager.LoadScene("SampleSceneChild", LoadSceneMode.Additive);
  }
}

Al cambiar de escena, LoadSceneMode establezco en , Single pero esta vez Additive es . Eso es todo lo que hay en la diferencia.

Después de SampleSceneParent guardar el script, adjúntelo a . EventSystem

Establezca el método en el OnClick botón.

Intenta ejecutar el juego para ver cómo funciona. Si hace clic en el botón, verá la escena del niño.

Además, si miras la jerarquía, puedes ver que hay dos escenas.

Sin embargo, a pesar de que se ha agregado la escena, parece que no se muestra el contenido del lienzo de la escena principal. Por el contrario, puede ver que los sprites en la escena principal se muestran en la parte posterior de acuerdo con el orden de las capas.

Además, si miras la consola, puedes ver que los registros se generan constantemente.

El contenido son los siguientes dos puntos.

  • Hay 2 sistemas de eventos en la escena. Asegúrese de que siempre haya exactamente un sistema de eventos en la escena
  • Hay 2 oyentes de audio en la escena. Asegúrese de que siempre haya exactamente un oyente de audio en la escena.

Cuando se utilizan varias escenas, es necesario corresponder a estos dos puntos y a la cámara.

Corregir errores de EventSystem

El contenido del registro es el siguiente.

Hay 2 sistemas de eventos en la escena. Asegúrese de que siempre haya exactamente un sistema de eventos en la escena

(Hay dos sistemas de eventos en la escena). Asegúrese de tener siempre un sistema de eventos en su escena)

Tal como está escrito, la combinación de EventSystem en una solución resolverá el problema.

SampleSceneParent se supone que siempre existe,SampleSceneChild así que elimínelo cuando EventSystem lo abra.

Por supuesto, tenga en cuenta que si se ejecuta solo, la interfaz de usuario, como los botones,SampleSceneChild no funcionará.

Puede ver que los registros de EventSystem han desaparecido cuando lo ejecuta.

SampleSceneParent Además, dado que está EventSystem presente, los botones en la escena infantil se pueden activar.

Corregir errores de AudioListeners

El contenido del registro es el siguiente.

Hay 2 oyentes de audio en la escena. Asegúrese de que siempre haya exactamente un oyente de audio en la escena.

(Hay dos oyentes de audio en la escena). Asegúrese de que solo haya un oyente de audio en la escena en todo momento. )

Main Camera Si observa los componentes de , puede ver que el agente de escucha de audio existe, por lo SampleSceneChild que puede eliminar el agente de escucha de audio en . Se puede resolver mediante el control de la cámara del siguiente elemento, por lo que lo trataremos allí.

Si desea conservar la cámara,SampleSceneChild eliminará este Audio Listener.

Cambiar la cámara para mostrar dos escenas

En cuanto a la causa de que solo se muestra el lienzo de la escena secundaria al agregar una escena secundaria, Esto se debe a que hay dos cámaras, la escena principal y la escena secundaria en el lienzo, y solo se muestra una cámara.

La solución a esto es mostrar el lienzo de ambas escenas con la cámara de la escena principal. El proceso consiste en reemplazar la cámara en el lienzo de la escena secundaria con la cámara de la escena principal después de agregar la escena secundaria.

Vamos a crear un script. El nombre es arbitrario, pero en este caso ChildSceneCamera es .

El script tiene este aspecto: Canvas Es un proceso de requisito previo para adjuntar a .

using System.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;

public class ChildSceneCamera : MonoBehaviour
{
  /// <summary>シーンに追加されたタイミングで処理されます。</summary>
  void Awake()
  {
    // 親のシーンのキャンバスを取得
    var parentScene = SceneManager.GetSceneByName("SampleSceneParent");
    var parentCanvas = parentScene.GetRootGameObjects().First(obj => obj.GetComponent<Canvas>() != null).GetComponent<Canvas>();

    // 子のシーンのキャンバスを取得
    var childCanvas = GetComponent<Canvas>();

    // 子のシーンのカメラを削除
    Object.Destroy(childCanvas.worldCamera.gameObject);

    // 子のシーンのキャンバスのカメラを親のシーンのカメラに置き換えます
    childCanvas.worldCamera = parentCanvas.worldCamera;
  }
}

Awake El método se ejecuta la primera vez que el objeto existe en la escena. Start Se ejecuta antes del método. Es bueno recordar que a menudo lo usas a menudo. Esta vez, se supone que se ejecutará cuando se agregue la escena infantil.

/// <summary>シーンに追加されたタイミングで処理されます。</summary>
void Awake()
{
  // 処理
}

Obtenga el lienzo de escena principal y el lienzo de escena secundaria para reemplazar la cámara. Hay varias formas de hacerlo, pero no es el tema principal, por lo que puedes pensar que puedes conseguirlo si lo haces de esta manera por el momento.

// 親のシーンのキャンバスを取得
var parentScene = SceneManager.GetSceneByName("SampleSceneParent");
var parentCanvas = parentScene.GetRootGameObjects().First(obj => obj.GetComponent<Canvas>() != null).GetComponent<Canvas>();

// 子のシーンのキャンバスを取得
var childCanvas = GetComponent<Canvas>();

Primero destruye la cámara Object.Destroy de la escena infantil. Incluso si se ha ido, no hay problema porque puede ser cubierto por la cámara de la escena de los padres. El destino Canvas.worldCamera de eliminación se recupera de . Es solo porque la misma cámara que tiene la escena en este punto está configurada y se puede adquirir fácilmente. Si realmente quieres eliminarlo, será mejor que saques la cámara de la escena.

// 子のシーンのカメラを削除
Object.Destroy(childCanvas.worldCamera.gameObject);

Finalmente, la escena Canvas.worldCamera del niño se reemplaza con la cámara de los padres.

// 子のシーンのキャンバスのカメラを親のシーンのカメラに置き換えます
childCanvas.worldCamera = parentCanvas.worldCamera;

Después de SampleSceneChild guardar el script, adjúntelo a . Canvas

Está bien si el resultado de ejecutar y agregar una escena secundaria es como se muestra en la figura siguiente. Asegúrese de que tampoco haya registros.