Dodawanie sceny

Strona zaktualizowana :
Data utworzenia strony :

Ś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 SampleSceneParentscena, 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.