Добавление сцены

Страница обновлена :
Дата создания страницы :

Среда верификации

Виндоус
  • Windows 11
Редактор Unity
  • 2020.3.25f1
Входной системный пакет
  • 1.2.0

Предпосылки для этого совета

Следующие настройки были сделаны заранее в качестве предпосылки для описания этого совета.

О добавлении сцены

Unity позволяет отображать несколько сцен одновременно. Используйте его, когда вы просто хотите наложить сцены или экспортировать свои рисунки в другую текстуру.

На этот раз я хотел бы объяснить наложенное отображение сцены, предполагая, что экран меню отображается на переднем плане, когда игра запущена, пока игра запущена.

При отображении нескольких сцен следует учитывать следующее:

  • Должно быть не более одной системы EventSystem
  • Должно быть не более одного аудиослушателя
  • Будьте осторожны при работе с несколькими камерами

Подготовьте сцену

На этот раз мы подготовим две сцены. Пусть будет , а сценаSampleSceneChild, SampleSceneParentкоторая будет отображаться дополнительно, будет . Метод подготовки двух сцен такой же, как и в предыдущих советах, поэтому, пожалуйста, обратитесь к ним.

На этот раз мы создадим следующий макет. Если вы нажмете кнопку в родительской сцене, не возникнет никаких проблем, кроме как добавить дочернюю сцену. и спрайты размещены, чтобы было легче Canvas понять симптомы, которые вы увидите позже.

SampleSceneParent

SampleSceneChild

При отображении нескольких сцен контекст объектов зависит от «порядка слоев» каждого объекта, независимо от единицы сцены. Поскольку все начальные значения равны 0, оставьте SampleSceneChild Canvas для параметра no и спрайты значение «1».

Не забудьте установить две сцены в настройках сборки.

Обработка сцен

Он обрабатывается в коде так же, как и переключение сцен. На этот раз он также обрабатывается при нажатии кнопки, но обрабатывается как дополнение, а не как переключатель сцены.

Имя файла скрипта произвольное, но здесь SceneAdd оно .

Скрипт выглядит следующим образом:

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

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

При переключении LoadSceneMode сцен я установил на , Single но на этот раз Additive это . Вот и вся разница.

После SampleSceneParent сохранения сценария прикрепите его к . EventSystem

Установите метод на кнопке OnClick .

Попробуйте запустить игру, чтобы увидеть, как она работает. Если вы нажмете кнопку, вы увидите дочернюю сцену.

Кроме того, если вы посмотрите на иерархию, вы увидите, что есть две сцены.

Однако, несмотря на то, что сцена была добавлена, кажется, что содержимое холста родительской сцены не отображается. И наоборот, вы можете видеть, что спрайты в родительской сцене отображаются на обратной стороне в соответствии с порядком слоев.

Также, если посмотреть на консоль, то можно увидеть, что логи постоянно выводятся.

Содержание состоит из следующих двух пунктов.

  • В сцене есть 2 системы событий. Пожалуйста, убедитесь, что в сцене всегда есть только одна система событий
  • В сцене есть 2 аудиослушателя. Пожалуйста, убедитесь, что в сцене всегда есть ровно один аудиослушатель.

При использовании нескольких сцен необходимо соответствовать этим двум точкам и камере.

Исправить ошибки EventSystem

Содержимое журнала выглядит следующим образом.

В сцене есть 2 системы событий. Пожалуйста, убедитесь, что в сцене всегда есть только одна система событий

(В сцене есть две системы событий.) Убедитесь, что у вас всегда есть одна система событий в вашей сцене)

Как написано, объединение EventSystem в одно решение решит проблему.

SampleSceneParent предполагается, что он существует всегда,SampleSceneChild поэтому удалите его при EventSystem открытии.

Конечно, обратите внимание, что если вы запускаете сам по себе, пользовательский интерфейс, такой как кнопки,SampleSceneChild не будет работать.

Вы можете видеть, что журналы EventSystem исчезли при запуске.

SampleSceneParent Кроме того, поскольку присутствуетEventSystem, кнопки в дочерней сцене могут быть активированы.

Исправить ошибки AudioListen

Содержимое журнала выглядит следующим образом.

В сцене есть 2 аудиослушателя. Пожалуйста, убедитесь, что в сцене всегда есть ровно один аудиослушатель.

(В сцене есть два аудиослушателя.) Убедитесь, что в сцене всегда присутствует только один аудиослушатель. )

Main Camera Если вы посмотрите на компоненты , вы, безусловно, увидите, что аудиопрослушиватель существует, поэтому SampleSceneChild вы можете удалить аудиопрослушиватель в . Ее можно решить управлением камерой следующего пункта, поэтому мы разберемся с ней там.

Если вы хотите сохранить камеру,SampleSceneChild вы удалите этот аудиослушатель.

Измените камеру, чтобы показать две сцены

Что касается причины, по которой при добавлении дочерней сцены отображается только холст дочерней сцены, Это связано с тем, что на холсте установлены две камеры, родительская сцена и дочерняя сцена, и отображается только одна камера.

Решение этой проблемы состоит в том, чтобы отобразить холст обеих сцен с помощью камеры родительской сцены. Процесс заключается в замене камеры на холсте дочерней сцены камерой родительской сцены после добавления дочерней сцены.

Давайте создадим сценарий. Название произвольное, но в данном случае ChildSceneCamera это .

Скрипт выглядит следующим образом: Canvas Это обязательный процесс, который необходимо присоединить к .

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 Метод выполняется при первом появлении объекта в сцене. Start Выполняется перед методом. Хорошо помнить, что вы часто используете его. На этот раз предполагается, что он будет выполнен при добавлении дочерней сцены.

/// <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 детской сцены. Даже если он исчезнет, проблем нет, потому что он может быть закрыт камерой родительской сцены. Целевой объект Canvas.worldCamera удаления извлекается из . Это просто потому, что та же камера, которая есть на сцене в этот момент, установлена и может быть легко приобретена. Если вы действительно хотите удалить его, вам лучше убрать камеру с места происшествия.

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

Наконец, дочерняя сцена Canvas.worldCamera заменяется камерой родителя.

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

После SampleSceneChild сохранения сценария прикрепите его к . Canvas

Ничего страшного, если результат выполнения и добавления дочерней сцены будет таким, как показано на рисунке ниже. Убедитесь, что журналов тоже нет.