Добавление сцены
Среда верификации
- Виндоус
-
- 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
Ничего страшного, если результат выполнения и добавления дочерней сцены будет таким, как показано на рисунке ниже. Убедитесь, что журналов тоже нет.