Afegir una escena

Pàgina actualitzada :
Data de creació de la pàgina :

Entorn de verificació

Windows
  • Finestres 11
Editor d'unitat
  • 25.3.2020
Paquet del sistema d'entrada
  • 1.2.0

Requisits previs per a aquest consell

La configuració següent s'ha fet amb antelació com a premissa per a la descripció d'aquest consell.

Sobre com afegir una escena

Unity us permet mostrar diverses escenes alhora. Utilitzeu-lo quan simplement vulgueu superposar escenes o exportar els vostres dibuixos a una textura diferent.

Aquesta vegada, m'agradaria explicar la visualització superposada de l'escena suposant que la pantalla del menú es mostra en primer pla mentre el joc s'executa mentre el joc s'executa.

Quan mostreu diverses escenes, heu de tenir en compte el següent:

  • No hi ha d'haver més d'un EventSystem
  • No hi ha d'haver més d'un oient d'àudio
  • Aneu amb compte quan manipuleu diverses càmeres

Preparar l'escena

En aquesta ocasió, prepararem dues escenes. Sigui , i SampleSceneParentl'escena SampleSceneChild que es mostrarà addicionalment és . El mètode de preparació de dues escenes és el mateix que els consells anteriors, així que consulteu-los.

En aquesta ocasió, crearem el següent layout. Si feu clic al botó de l'escena principal, no hi ha cap problema excepte afegir l'escena secundària. i es col·loquen sprites perquè sigui més fàcil entendre els símptomes que veureu més Canvas endavant.

SampleSceneParent

SampleSceneChild

Quan es mostren diverses escenes, el context dels objectes depèn de l'"ordre de capes" de cada objecte, independentment de la unitat d'escena. Com que els valors inicials són tots 0, deixeu SampleSceneChild Canvas el no i els sprites definits a "1".

No oblideu establir les dues escenes a la configuració de compilació.

Escenes de processament

Es processa en codi de la mateixa manera que es canvien d'escenes. Aquesta vegada també, es processa quan es fa clic al botó, però es processa com una addició en lloc d'un interruptor d'escena.

El nom del fitxer script és arbitrari, però aquí SceneAdd és .

El guió té aquest aspecte:

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

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

En canviar d'escena, em poso a , LoadSceneMode Single però aquesta vegada Additive és . Això és tot el que hi ha a la diferència.

Després SampleSceneParent de desar l'script, adjunteu-lo a . EventSystem

Establiu el mètode al OnClick botó.

Proveu d'executar el joc per veure com funciona. Si feu clic al botó, veureu l'escena infantil.

A més, si ens fixem en la jerarquia, podem veure que hi ha dues escenes.

No obstant això, malgrat que l'escena ha estat afegida, sembla que el contingut del llenç de l'escena mare no es mostra. Per contra, podeu veure que els sprites de l'escena principal es mostren a la part posterior segons l'ordre de les capes.

A més, si mireu la consola, podeu veure que els registres surten constantment.

El contingut són els dos punts següents.

  • Hi ha 2 sistemes d'esdeveniments en l'escena. Assegureu-vos que sempre hi hagi exactament un sistema d'esdeveniments a l'escena
  • Hi ha 2 oients d'àudio a l'escena. Assegureu-vos que sempre hi hagi exactament un oient d'àudio a l'escena.

Quan s'utilitzen diverses escenes, cal correspondre a aquests dos punts i a la càmera.

Corregir errors de l'EventSystem

El contingut del registre és el següent.

Hi ha 2 sistemes d'esdeveniments en l'escena. Assegureu-vos que sempre hi hagi exactament un sistema d'esdeveniments a l'escena

(Hi ha dos sistemes d'esdeveniments a l'escena.) Assegureu-vos que sempre tingueu un sistema d'esdeveniments a la vostra escena)

Tal com està escrit, combinar l'EventSystem en una sola solució resoldrà el problema.

SampleSceneParent se suposa que sempre existeix,SampleSceneChild així que elimineu-lo quan EventSystem l'obriu.

Per descomptat, tingueu en compte que si s'executa sol, la interfície d'usuari, com ara botons,SampleSceneChild no funcionarà.

Podeu veure que els registres d'EventSystem han desaparegut quan l'executeu.

SampleSceneParent També, ja que està EventSystem present, es poden activar els botons de l'escena infantil.

Corregir errors d'AudioListeners

El contingut del registre és el següent.

Hi ha 2 oients d'àudio a l'escena. Assegureu-vos que sempre hi hagi exactament un oient d'àudio a l'escena.

(Hi ha dos oients d'àudio a l'escena.) Assegureu-vos que només hi hagi un oient d'àudio a l'escena en tot moment. )

Main Camera Si mireu els components de , sens dubte podeu veure que l'oient d'àudio existeix, de manera SampleSceneChild que podeu suprimir l'oient d'àudio a . Es pot resoldre mitjançant el control de càmera del següent element, de manera que ens ocuparem d'això allà.

Si voleu mantenir la càmera,SampleSceneChild suprimireu aquest oient d'àudio.

Canviar la càmera per mostrar dues escenes

Pel que fa a la causa que només es mostra el llenç de l'escena infantil en afegir una escena infantil, Això es deu al fet que hi ha dues càmeres, l'escena pare i l'escena infantil ambientada al llenç, i només es mostra una càmera.

La solució a això és mostrar el llenç d'ambdues escenes amb la càmera de l'escena principal. El procés consisteix a substituir la càmera del llenç de l'escena infantil per la càmera de l'escena principal després d'afegir l'escena infantil.

Creem un script. El nom és arbitrari, però en aquest cas ChildSceneCamera és .

El guió té aquest aspecte: Canvas És un procés previ a 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ètode s'executa la primera vegada que l'objecte existeix en l'escena. Start S'executa abans del mètode. És bo recordar que sovint l'utilitzeu sovint. Aquesta vegada, se suposa que s'executarà quan s'afegeixi l'escena infantil.

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

Obteniu el llenç de l'escena principal i el llenç d'escena infantil per substituir la càmera. Hi ha diverses maneres de fer-ho, però no és el tema principal, de manera que podeu pensar que podeu aconseguir-ho si ho feu d'aquesta manera de moment.

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

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

Destruïu primer la càmera Object.Destroy de l'escena infantil. Fins i tot si ha desaparegut, no hi ha cap problema perquè pot ser cobert per la càmera de l'escena dels pares. L'objectiu Canvas.worldCamera de supressió es recupera de . És només perquè la mateixa càmera que té l'escena en aquest punt està ambientada i es pot adquirir fàcilment. Si realment voleu suprimir-lo, és millor que obtingueu la càmera de l'escena.

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

Finalment, l'escena Canvas.worldCamera infantil és substituïda per la càmera dels pares.

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

Després SampleSceneChild de desar l'script, adjunteu-lo a . Canvas

Està bé si el resultat d'executar i afegir una escena secundària és el que es mostra a la figura següent. Assegureu-vos que tampoc hi hagi registres.