Dodawanie sceny
Środowisko weryfikacji
- Windows
-
- Okna 11
- Edytor Unity
-
- 2020.3.25f1
- Pakiet systemu wejściowego
-
- 1.2.0
Wymagania wstępne dotyczące tej porady
Poniższe ustawienia zostały wcześniej wprowadzone jako przesłanka do opisu tej wskazówki.
Dodawanie sceny — informacje
Unity umożliwia wyświetlanie wielu scen jednocześnie. Użyj go, gdy chcesz po prostu nałożyć sceny lub wyeksportować rysunki do innej tekstury.
Tym razem chciałbym wyjaśnić nałożone na siebie wyświetlanie sceny przy założeniu, że ekran menu jest wyświetlany na pierwszym planie, gdy gra jest uruchomiona, gdy gra jest uruchomiona.
Podczas wyświetlania wielu scen należy pamiętać o następujących kwestiach:
- Nie może istnieć więcej niż jeden EventSystem
- Nie może być więcej niż jeden odbiornik audio
- Zachowaj ostrożność podczas obsługi wielu kamer
Przygotuj scenę
Tym razem przygotujemy dwie odsłony. Niech będzie , a SampleSceneParent
scena, SampleSceneChild
która ma być wyświetlana dodatkowo, to .
Sposób przygotowania dwóch scen jest taki sam jak poprzednie wskazówki, dlatego prosimy o zapoznanie się z nimi.
Tym razem stworzymy następujący układ. Jeśli klikniesz przycisk w scenie nadrzędnej, nie ma problemu z wyjątkiem dodania sceny podrzędnej.
A duszki są umieszczane, aby ułatwić Canvas
zrozumienie objawów, które zobaczysz później.
PrzykładowaScenaNadrzędna
SampleSceneChild
Gdy wyświetlanych jest wiele scen, kontekst obiektów zależy od "kolejności warstw" każdego obiektu, niezależnie od jednostki sceny.
Ponieważ wszystkie wartości początkowe to 0, pozostaw SampleSceneChild
Canvas
sprite'y no i sprite'y ustawione na "1".
Nie zapomnij ustawić dwóch scen w ustawieniach kompilacji.
Przetwarzanie scen
Jest przetwarzany w kodzie w taki sam sposób, jak przełączanie scen. Również tym razem jest przetwarzany po kliknięciu przycisku, ale jest przetwarzany jako dodatek, a nie przełącznik sceny.
Nazwa pliku skryptu jest dowolna, ale tutaj SceneAdd
jest .
Skrypt wygląda tak:
using UnityEngine;
using UnityEngine.SceneManagement; // 追加
public class SceneAdd : MonoBehaviour
{
<summary>ボタンをクリックしたときに呼ばれます。</summary>
public void OnClick()
{
// 指定したシーンを追加します
SceneManager.LoadScene("SampleSceneChild", LoadSceneMode.Additive);
}
}
Podczas przełączania LoadSceneMode
scen ustawiam na , Single
ale tym razem Additive
jest to .
To wszystko, co jest w różnicy.
Po SampleSceneParent
zapisaniu skryptu dołącz go do programu . EventSystem
Ustaw metodę na przycisku OnClick
.
Spróbuj uruchomić grę, aby zobaczyć, jak to działa. Jeśli klikniesz przycisk, zobaczysz scenę podrzędną.
Ponadto, jeśli spojrzysz na hierarchię, zobaczysz, że są dwie sceny.
Jednak pomimo tego, że scena została dodana, wydaje się, że zawartość kanwy sceny nadrzędnej nie jest wyświetlana. I odwrotnie, można zobaczyć, że duszki w scenie nadrzędnej są wyświetlane na tylnej stronie zgodnie z kolejnością warstw.
Ponadto, jeśli spojrzysz na konsolę, zobaczysz, że dzienniki są stale wyprowadzane.
Treść to następujące dwa punkty.
- Na scenie znajdują się 2 systemy zdarzeń. Upewnij się, że w scenie zawsze istnieje dokładnie jeden system zdarzeń
- Na scenie są 2 słuchaczy audio. Upewnij się, że w scenie zawsze jest dokładnie jeden słuchacz dźwięku.
Podczas korzystania z wielu scen konieczne jest dopasowanie tych dwóch punktów i kamery.
Napraw błędy EventSystem
Zawartość dziennika jest następująca.
Na scenie znajdują się 2 systemy zdarzeń. Upewnij się, że w scenie zawsze istnieje dokładnie jeden system zdarzeń
(W scenie występują dwa systemy zdarzeń). Upewnij się, że zawsze masz jeden system zdarzeń w scenie)
Jak napisano, połączenie EventSystem w jedno rozwiązanie rozwiąże problem.
SampleSceneParent
zakłada się, że zawsze istnieje,SampleSceneChild
więc usuń go po EventSystem
otwarciu.
Oczywiście należy pamiętać, że jeśli uruchomisz samodzielnie, interfejs użytkownika, taki jak przyciski,SampleSceneChild
nie będzie działał.
Widać, że dzienniki EventSystem zniknęły po uruchomieniu.
SampleSceneParent
Ponadto, ponieważ jest EventSystem
obecny, przyciski w scenie podrzędnej mogą być aktywowane.
Napraw błędy AudioListeners
Zawartość dziennika jest następująca.
Na scenie są 2 słuchaczy audio. Upewnij się, że w scenie zawsze jest dokładnie jeden słuchacz dźwięku.
(W scenie są dwa słuchacze audio.) Upewnij się, że w scenie jest zawsze tylko jeden słuchacz dźwięku. )
Main Camera
Jeśli spojrzysz na składniki , z pewnością zobaczysz, że odbiornik audio istnieje, więc SampleSceneChild
możesz usunąć odbiornik audio w .
Można to rozwiązać za pomocą kamery sterującej następnym elementem, więc zajmiemy się nim tam.
Jeśli chcesz zachować kamerę,SampleSceneChild
usuniesz ten słuchacz audio.
Zmień kamerę, aby wyświetlić dwie sceny
Jeśli chodzi o przyczynę, że podczas dodawania sceny podrzędnej wyświetlane jest tylko płótno sceny podrzędnej, Dzieje się tak, ponieważ na obszarze roboczym są ustawione dwie kamery, scena nadrzędna i scena podrzędna, a wyświetlana jest tylko jedna kamera.
Rozwiązaniem tego problemu jest wyświetlenie płótna obu scen za pomocą kamery sceny nadrzędnej. Proces polega na zastąpieniu kamery na obszarze roboczym sceny podrzędnej kamerą sceny nadrzędnej po dodaniu sceny podrzędnej.
Stwórzmy skrypt. Nazwa jest arbitralna, ale w tym przypadku ChildSceneCamera
jest .
Skrypt wygląda tak: Canvas
Jest to proces wstępny do dołączenia do .
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
Metoda jest wykonywana przy pierwszym istnieniu obiektu w scenie. Start
Wykonuje przed metodą.
Warto pamiętać, że często go używasz.
Tym razem zakłada się, że zostanie on wykonany po dodaniu sceny podrzędnej.
<summary>シーンに追加されたタイミングで処理されます。</summary>
void Awake()
{
// 処理
}
Pobierz kanwę sceny nadrzędnej i kanwę sceny podrzędnej, aby zastąpić kamerę. Istnieją różne sposoby, aby to zrobić, ale nie jest to główny temat, więc możesz myśleć, że możesz to osiągnąć, jeśli zrobisz to w ten sposób na razie.
// 親のシーンのキャンバスを取得
var parentScene = SceneManager.GetSceneByName("SampleSceneParent");
var parentCanvas = parentScene.GetRootGameObjects().First(obj => obj.GetComponent<Canvas>() != null).GetComponent<Canvas>();
// 子のシーンのキャンバスを取得
var childCanvas = GetComponent<Canvas>();
Najpierw zniszcz kamerę Object.Destroy
sceny dziecięcej. Nawet jeśli go nie ma, nie ma problemu, ponieważ może być zasłonięty kamerą sceny rodzica.
Cel Canvas.worldCamera
usuwania jest pobierany z pliku .
To tylko dlatego, że ta sama kamera, którą scena ma w tym momencie, jest ustawiona i można ją łatwo zdobyć.
Jeśli naprawdę chcesz go usunąć, lepiej zabierz kamerę ze sceny.
// 子のシーンのカメラを削除
Object.Destroy(childCanvas.worldCamera.gameObject);
Na koniec scena Canvas.worldCamera
dziecka zostaje zastąpiona kamerą rodzica.
// 子のシーンのキャンバスのカメラを親のシーンのカメラに置き換えます
childCanvas.worldCamera = parentCanvas.worldCamera;
Po SampleSceneChild
zapisaniu skryptu dołącz go do programu . Canvas
Jest OK, jeśli wynik wykonania i dodania sceny podrzędnej jest taki, jak pokazano na poniższym rysunku. Upewnij się, że nie ma żadnych dzienników.