Adicionar uma cena
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 SampleSceneParent
a 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.