Добавяне на сцена

Страницата се актуализира :
Дата на създаване на страница :

Среда за проверка

Уиндоус
  • Прозорци 11
Редактор на единство
  • 2020.3.25ф1
Пакет на входната система
  • 1.2.0

Предпоставки за този съвет

Следните настройки са направени предварително като предпоставка за описанието на този съвет.

За добавянето на сцена

Unity ви позволява да показвате няколко сцени едновременно. Използвайте го, когато просто искате да наслагвате сцени или да експортирате рисунките си в различна текстура.

Този път бих искал да обясня насложеното показване на сцената, ако приемем, че екранът на менюто се показва на преден план, докато играта работи, докато играта работи.

Когато показвате няколко сцени, трябва да сте наясно със следното:

  • Не трябва да има повече от една система за събития
  • Не трябва да има повече от един аудио слушател
  • Бъдете внимателни при работа с няколко камери

Подгответе сцената

Този път ще подготвим две сцени. Позволявам да бъде , и SampleSceneParentсцената SampleSceneChild , за да се покаже допълнително е . Методът за подготовка на две сцени е същият като предишните съвети, така че моля, обърнете се към тях.

Този път ще създадем следното оформление. Ако щракнете върху бутона в родителската сцена, няма друг проблем, освен да добавите дъщерната сцена. и спрайтове са поставени, за да се улесни разбирането на симптомите, Canvas които ще видите по-късно.

Примерна сценаРодител

Примерна сценаДете

Когато се показват няколко сцени, контекстът на обектите зависи от "реда на слоевете" на всеки обект, независимо от единицата на сцената. Тъй като всички начални стойности са 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 аудио слушатели. Моля, уверете се, че винаги има точно един аудио слушател в сцената.

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

Коригиране на грешки в системата за събития

Съдържанието на дневника е както следва.

На сцената има 2 системи за събития. Моля, уверете се, че винаги има точно една система за събития в сцената

(В сцената има две системи за събития.) Уверете се, че винаги имате една система за събития във вашата сцена)

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

SampleSceneParent се приема, че винаги съществува, така че го изтрийте,SampleSceneChild когато EventSystem го отворите.

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

Можете да видите, че регистрационните файлове на EventSystem са изчезнали, когато го стартирате.

SampleSceneParent Също така, тъй като е EventSystem налице, бутоните в детската сцена могат да бъдат активирани.

Коригирайте грешките на AudioListeners

Съдържанието на дневника е както следва.

На сцената има 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

Добре е, ако резултатът от изпълнението и добавянето на дъщерна сцена е както е показано на фигурата по-долу. Уверете се, че няма и регистрационни файлове.