Agregar una escena
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 SampleSceneParent
la 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.