Hinzufügen einer Szene

Diese Seite wurde aktualisiert :
Erstellungsdatum der Seite :

Verifizierungsumgebung

Fenster
  • Windows 11
Unity-Editor
  • 2020.3.25f1
Eingabesystem-Paket
  • 1.2.0

Voraussetzungen für diesen Tipp

Die folgenden Einstellungen wurden im Vorfeld als Prämisse für die Beschreibung dieses Tipps vorgenommen.

Hinzufügen einer Szene

Mit Unity können Sie mehrere Szenen gleichzeitig anzeigen. Verwenden Sie es, wenn Sie einfach Szenen überlagern oder Ihre Zeichnungen in eine andere Textur exportieren möchten.

Diesmal möchte ich die überlagerte Darstellung der Szene unter der Annahme erklären, dass der Menübildschirm im Vordergrund angezeigt wird, während das Spiel läuft, während das Spiel läuft.

Wenn Sie mehrere Szenen anzeigen, sollten Sie Folgendes beachten:

  • Es darf nicht mehr als ein EventSystem vorhanden sein
  • Es darf nicht mehr als ein Audio-Listener vorhanden sein
  • Seien Sie vorsichtig, wenn Sie mit mehreren Kameras umgehen

Vorbereiten der Szene

Diesmal bereiten wir zwei Szenen vor. Sei , und SampleSceneParentdie Szene SampleSceneChild , die zusätzlich angezeigt werden soll, ist . Die Methode zum Vorbereiten von zwei Szenen ist die gleiche wie bei den vorherigen Tipps, also beachten Sie sie bitte.

Dieses Mal erstellen wir das folgende Layout. Wenn Sie in der übergeordneten Szene auf die Schaltfläche klicken, gibt es kein Problem, außer die untergeordnete Szene hinzuzufügen. Und Sprites werden platziert, um es einfacher zu machen, die Symptome zu Canvas verstehen, die Sie später sehen werden.

SampleSceneParent

SampleSceneChild

Wenn mehrere Szenen angezeigt werden, hängt der Kontext der Objekte von der "Ebenenreihenfolge" jedes Objekts ab, unabhängig von der Szeneneinheit. Da die Anfangswerte alle 0 sind, lassen Sie SampleSceneChild Canvas no und sprites auf "1" gesetzt.

Vergessen Sie nicht, die beiden Szenen in den Build-Einstellungen festzulegen.

Bearbeiten von Szenen

Es wird im Code auf die gleiche Weise verarbeitet wie das Wechseln von Szenen. Auch dieses Mal wird es beim Klicken auf die Schaltfläche verarbeitet, aber es wird als Addition und nicht als Szenenwechsel verarbeitet.

Der Name der Skriptdatei ist willkürlich, aber hier SceneAdd ist er .

Das Skript sieht wie folgt aus:

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

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

Beim Wechseln LoadSceneMode der Szenen stelle ich auf , Single aber dieses Mal Additive ist es . Das ist alles, was den Unterschied ausmacht.

Nachdem SampleSceneParent Sie das Skript gespeichert haben, hängen Sie es an . EventSystem

Legen Sie die Methode für die OnClick Schaltfläche fest.

Versuchen Sie, das Spiel auszuführen, um zu sehen, wie es funktioniert. Wenn Sie auf die Schaltfläche klicken, sehen Sie die untergeordnete Szene.

Wenn Sie sich die Hierarchie ansehen, können Sie auch sehen, dass es zwei Szenen gibt.

Trotz der Tatsache, dass die Szene hinzugefügt wurde, scheint der Inhalt des Canvas der übergeordneten Szene nicht angezeigt zu werden. Umgekehrt können Sie sehen, dass die Sprites in der übergeordneten Szene entsprechend der Reihenfolge der Ebenen auf der Rückseite angezeigt werden.

Wenn Sie sich die Konsole ansehen, können Sie auch sehen, dass die Protokolle ständig ausgegeben werden.

Der Inhalt besteht aus den folgenden zwei Punkten.

  • Es gibt 2 Ereignissysteme in der Szene. Bitte stellen Sie sicher, dass es immer genau ein Event-System in der Szene gibt
  • Es gibt 2 Audiohörer in der Szene. Bitte stellen Sie sicher, dass sich immer genau ein Audiohörer in der Szene befindet.

Wenn Sie mehrere Szenen verwenden, ist es notwendig, diesen beiden Punkten und der Kamera zu entsprechen.

EventSystem-Fehler beheben

Der Inhalt des Protokolls lautet wie folgt.

Es gibt 2 Ereignissysteme in der Szene. Bitte stellen Sie sicher, dass es immer genau ein Event-System in der Szene gibt

(Es gibt zwei Ereignissysteme in der Szene.) Stellen Sie sicher, dass Sie immer ein Ereignissystem in Ihrer Szene haben)

Wie bereits geschrieben, wird das Problem durch die Kombination des EventSystems in einer Lösung gelöst.

SampleSceneParent Es wird davon ausgegangen, dass es immer existiert, also löschen Sie es,SampleSceneChild wenn EventSystem Sie es öffnen.

Bitte beachten Sie natürlich, dass die Benutzeroberfläche, z. B. Schaltflächen, nicht funktioniert, wenn Sie sie alleine ausführen.SampleSceneChild

Sie können sehen, dass die EventSystem-Protokolle verschwunden sind, wenn Sie es ausführen.

SampleSceneParent Da vorhanden istEventSystem, können auch die Schaltflächen in der untergeordneten Szene aktiviert werden.

AudioListeners-Fehler beheben

Der Inhalt des Protokolls lautet wie folgt.

Es gibt 2 Audiohörer in der Szene. Bitte stellen Sie sicher, dass sich immer genau ein Audiohörer in der Szene befindet.

(Es gibt zwei Audiohörer in der Szene.) Stellen Sie sicher, dass sich immer nur ein Audiohörer in der Szene befindet. )

Main Camera Wenn Sie sich die Komponenten von ansehen, können Sie sicherlich sehen, dass der Audio-Listener vorhanden ist, sodass SampleSceneChild Sie den Audio-Listener in löschen können. Es kann durch Kamerasteuerung des nächsten Punktes gelöst werden, also werden wir uns dort damit befassen.

Wenn Sie die Kamera behalten möchten,SampleSceneChild löschen Sie diesen Audio-Listener.

Ändern Sie die Kamera, um zwei Szenen anzuzeigen

Was die Ursache betrifft, dass beim Hinzufügen einer untergeordneten Szene nur die Leinwand der untergeordneten Szene angezeigt wird, Dies liegt daran, dass zwei Kameras, die übergeordnete Szene und die untergeordnete Szene, auf der Arbeitsfläche festgelegt sind und nur eine Kamera angezeigt wird.

Die Lösung besteht darin, die Leinwand beider Szenen mit der Kamera der übergeordneten Szene anzuzeigen. Der Vorgang besteht darin, die Kamera auf der Arbeitsfläche der untergeordneten Szene durch die Kamera der übergeordneten Szene zu ersetzen, nachdem die untergeordnete Szene hinzugefügt wurde.

Lassen Sie uns ein Skript erstellen. Der Name ist willkürlich, aber in diesem Fall ChildSceneCamera ist es .

Das Skript sieht wie folgt aus: Canvas Es ist ein Voraussetzungsprozess für das Anhängen an .

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 Die Methode wird ausgeführt, wenn das Objekt zum ersten Mal in der Szene vorhanden ist. Start Wird vor der Methode ausgeführt. Es ist gut, sich daran zu erinnern, dass Sie es oft verwenden. Dieses Mal wird davon ausgegangen, dass es ausgeführt wird, wenn die untergeordnete Szene hinzugefügt wird.

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

Rufen Sie die übergeordnete Szenenleinwand und die untergeordnete Szenenleinwand ab, um die Kamera zu ersetzen. Es gibt verschiedene Möglichkeiten, es zu tun, aber es ist nicht das Hauptthema, also können Sie denken, dass Sie es bekommen können, wenn Sie es vorerst so machen.

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

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

Zerstöre zuerst die Kamera Object.Destroy der Kinderszene. Selbst wenn es weg ist, gibt es kein Problem, da es von der Kamera der Szene des Elternteils verdeckt werden kann. Das Löschziel Canvas.worldCamera wird aus abgerufen. Es liegt nur daran, dass die gleiche Kamera, die die Szene zu diesem Zeitpunkt hat, eingestellt ist und leicht erfasst werden kann. Wenn Sie es tatsächlich löschen möchten, sollten Sie die Kamera besser von der Szene entfernen.

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

Schließlich wird die Kinderszene Canvas.worldCamera durch die Kamera des Elternteils ersetzt.

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

Nachdem SampleSceneChild Sie das Skript gespeichert haben, hängen Sie es an . Canvas

Es ist in Ordnung, wenn das Ergebnis des Ausführens und Hinzufügens einer untergeordneten Szene wie in der folgenden Abbildung dargestellt ist. Stellen Sie sicher, dass auch keine Protokolle vorhanden sind.