Додавання образу

Сторінка оновлюється :
Дата створення сторінки :

Середовище перевірки

Вікна
  • вікна 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

Це нормально, якщо результат виконання та додавання дочірньої сцени такий, як показано на малюнку нижче. Переконайтеся, що журналів також немає.