Adicionar uma cena

Página atualizada :
Data de criação de página :

Ambiente de verificação

Windows
  • Janelas 11
Unity Editor
  • 25.3.2020F1
Pacote do sistema de entrada
  • 1.2.0

Pré-requisitos para esta dica

As configurações a seguir foram feitas com antecedência como premissa para a descrição desta dica.

Sobre a adição de uma cena

Unity permite que você exiba várias cenas ao mesmo tempo. Use-o quando você simplesmente quiser sobrepor cenas ou exportar seus desenhos para uma textura diferente.

Desta vez, gostaria de explicar a exibição sobreposta da cena assumindo que a tela do menu é exibida em primeiro plano enquanto o jogo está sendo executado enquanto o jogo está em execução.

Ao exibir várias cenas, você deve estar ciente do seguinte:

  • Não deve haver mais de um EventSystem
  • Não deve haver mais de um ouvinte de áudio
  • Tenha cuidado ao manusear várias câmeras

Prepare a cena

Desta vez, vamos preparar duas cenas. Vamos ser , e SampleSceneParenta cena SampleSceneChild a ser exibida adicionalmente é . O método de preparação de duas cenas é o mesmo das dicas anteriores, então consulte-as.

Desta vez, vamos criar o seguinte layout. Se você clicar no botão na cena pai, não haverá nenhum problema, exceto adicionar a cena filho. e sprites são colocados para facilitar a Canvas compreensão dos sintomas que você verá mais tarde.

SampleSceneParent

SampleSceneChild

Quando várias cenas são exibidas, o contexto dos objetos depende da "ordem de camadas" de cada objeto, independentemente da unidade de cena. Como os valores iniciais são todos 0, deixe SampleSceneChild Canvas o não e os sprites definidos como "1".

Não se esqueça de definir as duas cenas nas configurações de compilação.

Processando cenas

Ele é processado em código da mesma forma que a troca de cenas. Desta vez, ele também é processado quando o botão é clicado, mas é processado como uma adição em vez de uma opção de cena.

O nome do arquivo de script é arbitrário, mas aqui SceneAdd está .

O script tem a seguinte aparência:

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

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

Ao trocar de cena, eu defini para , LoadSceneMode Single mas desta vez Additive é . Isso é tudo o que há para a diferença.

Depois de SampleSceneParent salvar o script, anexe-o ao . EventSystem

Defina o OnClick método no botão.

Tente executar o jogo para ver como ele funciona. Se você clicar no botão, você verá a cena infantil.

Além disso, se você olhar para a hierarquia, verá que há duas cenas.

No entanto, apesar do fato de que a cena foi adicionada, parece que o conteúdo do Canvas da cena pai não é exibido. Por outro lado, você pode ver que os sprites na cena pai são exibidos no lado de trás de acordo com a ordem das camadas.

Além disso, se você olhar para o console, poderá ver que os logs são constantemente produzidos.

O conteúdo é o seguinte dois pontos.

  • Existem 2 sistemas de eventos na cena. Certifique-se de que há sempre exatamente um sistema de eventos na cena
  • Há 2 ouvintes de áudio na cena. Certifique-se de que sempre haja exatamente um ouvinte de áudio na cena.

Ao usar várias cenas, é necessário corresponder a esses dois pontos e à câmera.

Corrigir erros do EventSystem

O conteúdo do log é o seguinte.

Existem 2 sistemas de eventos na cena. Certifique-se de que há sempre exatamente um sistema de eventos na cena

(Há dois sistemas de eventos na cena.) Certifique-se de sempre ter um sistema de eventos em sua cena)

Como escrito, combinar o EventSystem em uma solução resolverá o problema.

SampleSceneParent presume-se que sempre exista, portanto,SampleSceneChild exclua-o quando EventSystem você abri-lo.

Claro, observe que, se você executar sozinho, a interface do usuário, como botões,SampleSceneChild não funcionará.

Você pode ver que os logs do EventSystem desapareceram quando você executá-lo.

SampleSceneParent Além disso, uma vez que está EventSystem presente, os botões na cena infantil podem ser ativados.

Corrigir erros do AudioListeners

O conteúdo do log é o seguinte.

Há 2 ouvintes de áudio na cena. Certifique-se de que sempre haja exatamente um ouvinte de áudio na cena.

(Há dois ouvintes de áudio na cena.) Certifique-se de que haja apenas um ouvinte de áudio na cena em todos os momentos. )

Main Camera Se você olhar para os componentes do , você certamente pode ver que o Audio Listener existe, então SampleSceneChild você pode excluir o Audio Listener no . Ele pode ser resolvido pelo controle de câmera do próximo item, então vamos lidar com isso lá.

Se você quiser manter a câmera,SampleSceneChild excluirá este Ouvinte de áudio.

Alterar a câmera para mostrar duas cenas

Quanto à causa de que apenas a tela da cena infantil é exibida ao adicionar uma cena infantil, Isso ocorre porque há duas câmeras, a cena pai e a cena filho definidas na tela, e apenas uma câmera é exibida.

A solução para isso é exibir a tela de ambas as cenas com a câmera da cena pai. O processo consiste em substituir a câmera na tela da cena infantil pela câmera da cena pai depois que a cena infantil for adicionada.

Vamos criar um script. O nome é arbitrário, mas neste caso ChildSceneCamera é .

O script tem a seguinte aparência: Canvas É um processo de pré-requisito para anexar ao .

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 O método é executado na primeira vez que o objeto existe na cena. Start Executa antes do método. É bom lembrar que você costuma usá-lo com frequência. Desta vez, presume-se que será executado quando a cena infantil for adicionada.

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

Obtenha a tela de cena pai e a tela de cena filho para substituir a câmera. Existem várias maneiras de fazê-lo, mas não é o assunto principal, então você pode pensar que pode obtê-lo se você fazê-lo desta maneira por enquanto.

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

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

Destrua a câmera Object.Destroy da cena infantil primeiro. Mesmo que ele tenha desaparecido, não há problema porque ele pode ser coberto pela câmera da cena do pai. O destino Canvas.worldCamera de exclusão é recuperado de . É só porque a mesma câmera que a cena tem neste momento está configurada e pode ser facilmente adquirida. Se você realmente quiser excluí-lo, é melhor obter a câmera da cena.

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

Finalmente, a cena Canvas.worldCamera infantil é substituída pela câmera dos pais.

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

Depois de SampleSceneChild salvar o script, anexe-o ao . Canvas

Tudo bem se o resultado da execução e adição de uma cena infantil for como mostrado na figura abaixo. Certifique-se de que também não há registros.