Додавання образу
Середовище перевірки
- Вікна
-
- вікна 11
- Редактор єдності
-
- 2020.3.25f1
- Пакет системи введення
-
- 1.2.0
Передумови для цієї поради
Наступні настройки були зроблені заздалегідь як передумова для опису цієї поради.
Додавання образу
Unity дозволяє відображати кілька сцен одночасно. Використовуйте його, коли потрібно просто перекласти сцени або експортувати малюнки в іншу текстуру.
Цього разу я хотів би пояснити накладене відображення сцени, припускаючи, що екран меню відображається на передньому плані під час роботи гри під час роботи гри.
Під час відображення кількох сцен слід пам'ятати про таке:
- Повинно бути не більше однієї EventSystem
- Аудіослухачів має бути не більше одного
- Будьте обережні під час роботи з кількома камерами
Підготуйте сцену
Цього разу ми підготуємо дві сцени. Нехай be , а SampleSceneParent
сцена SampleSceneChild
, яка буде відображена додатково, дорівнює .
Спосіб підготовки двох сцен такий же, як і попередні поради, тому, будь ласка, зверніться до них.
Цього разу ми створимо наступний макет. Якщо натиснути кнопку в батьківській сцені, не виникне жодних проблем, окрім як додати дочірню сцену.
А спрайт розміщують, щоб було легше 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
присутня, кнопки в дитячій сцені можуть бути активовані.
Виправте помилки AudioListeners
Вміст журналу наступний.
На сцені є 2 аудіослухача. Будь ласка, переконайтеся, що на сцені завжди є рівно один слухач звуку.
(На сцені є два аудіослухача.) Переконайтеся, що на сцені постійно є лише один слухач звуку. )
Main Camera
Якщо ви подивитеся на компоненти , ви, безумовно, можете побачити, що Audio Listener існує, тому SampleSceneChild
ви можете видалити Audio Listener у .
Вирішити її можна за допомогою камерного управління наступним пунктом, тому розберемося з нею і там.
Якщо ви хочете зберегти камеру,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
Це нормально, якщо результат виконання та додавання дочірньої сцени такий, як показано на малюнку нижче. Переконайтеся, що журналів також немає.