Pridanie scény

Stránka aktualizovaná :
Dátum vytvorenia strany :

Prostredie overovania

Windows
  • Windows 11
Editor jednoty
  • 2020.3.25f1
Vstupný systémový balík
  • 1.2.0

Predpoklady pre tento tip

Nasledujúce nastavenia boli vykonané vopred ako predpoklad pre popis tohto tipu.

Pridanie scény

Unity umožňuje zobraziť viac scén súčasne. Použite ho, ak chcete jednoducho prekryť scény alebo exportovať kresby do inej textúry.

Tentokrát by som chcel vysvetliť prekrývajúce sa zobrazenie scény za predpokladu, že obrazovka ponuky sa zobrazuje v popredí, zatiaľ čo hra beží, zatiaľ čo hra beží.

Pri zobrazovaní viacerých scén by ste mali mať na pamäti nasledovné:

  • Nesmie existovať viac ako jeden systém udalostí
  • Nesmie byť viac ako jeden poslucháč zvuku
  • Pri manipulácii s viacerými kamerami buďte opatrní

Príprava scény

Tentokrát pripravíme dve scény. Nech je , a scénaSampleSceneParentSampleSceneChild, ktorá sa má dodatočne zobraziť, je . Spôsob prípravy dvoch scén je rovnaký ako predchádzajúce tipy, preto si ich prosím prečítajte.

Tentokrát vytvoríme nasledujúce rozloženie. Ak kliknete na tlačidlo v nadradenej scéne, nie je problém okrem pridania podradenej scény. a sprity sú umiestnené tak, aby uľahčili Canvas pochopenie príznakov, ktoré uvidíte neskôr.

SampleSceneParent

VzorkaSceneChild

Keď sa zobrazuje viac scén, kontext objektov závisí od "poradia vrstiev" každého objektu bez ohľadu na jednotku scény. Keďže počiatočné hodnoty sú všetky 0, ponechajte SampleSceneChild Canvas čísla nie a zložené položky nastavené na "1".

Nezabudnite nastaviť dve scény v nastaveniach zostavenia.

Spracovanie scén

Spracováva sa v kóde rovnakým spôsobom ako prepínanie scén. Aj tentoraz sa spracuje po kliknutí na tlačidlo, ale namiesto prepínača scén sa spracuje ako doplnok.

Názov súboru skriptu je ľubovoľný, ale tu SceneAdd je .

Skript vyzerá takto:

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

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

Pri prepínaní scén LoadSceneMode som nastavil na , Single ale tentoraz Additive je to . To je všetko, čo k tomu patrí.

Po SampleSceneParent uložení skriptu ho priložte k súboru . EventSystem

Nastavte metódu OnClick na tlačidle.

Skúste hru spustiť a zistite, ako funguje. Ak kliknete na tlačidlo, zobrazí sa detská scéna.

Ak sa pozriete na hierarchiu, môžete vidieť, že existujú dve scény.

Napriek tomu, že scéna bola pridaná, zdá sa, že obsah plátna nadradenej scény sa nezobrazuje. Naopak, môžete vidieť, že sprity v nadradenej scéne sa zobrazujú na zadnej strane podľa poradia vrstiev.

Tiež, ak sa pozriete na konzolu, môžete vidieť, že protokoly sú neustále výstupné.

Obsahom sú nasledujúce dva body.

  • Na scéne sú 2 systémy udalostí. Uistite sa, že na scéne je vždy presne jeden systém udalostí
  • Na scéne sú 2 zvukoví poslucháči. Uistite sa, že na scéne je vždy presne jeden zvukový poslucháč.

Pri použití viacerých scén je potrebné korešpondovať s týmito dvoma bodmi a kamerou.

Oprava chýb EventSystem

Obsah denníka je nasledujúci.

Na scéne sú 2 systémy udalostí. Uistite sa, že na scéne je vždy presne jeden systém udalostí

(Na scéne sú dva systémy udalostí.) Uistite sa, že máte na scéne vždy jeden systém udalostí)

Ako je napísané, kombinácia EventSystem do jedného riešenia problém vyrieši.

SampleSceneParent Predpokladá sa, že vždy existuje,SampleSceneChild preto ho po EventSystem otvorení odstráňte.

Samozrejme, upozorňujeme, že ak spustíte samostatne, používateľské rozhranie, ako sú tlačidlá,SampleSceneChild nebude fungovať.

Môžete vidieť, že denníky EventSystem zmizli, keď ho spustíte.

SampleSceneParent Keďže je prítomný, je EventSystem možné aktivovať aj tlačidlá v podradenej scéne.

Oprava chýb AudioListeners

Obsah denníka je nasledujúci.

Na scéne sú 2 zvukoví poslucháči. Uistite sa, že na scéne je vždy presne jeden zvukový poslucháč.

(Na scéne sú dvaja zvukoví poslucháči.) Uistite sa, že na scéne je vždy iba jeden zvukový poslucháč. )

Main Camera Ak sa pozriete na komponenty , určite môžete vidieť, že Audio Listener existuje, takže SampleSceneChild môžete odstrániť Audio Listener v . Dá sa to vyriešiť kamerovým ovládaním ďalšej položky, takže sa jej budeme venovať tam.

Ak si chcete kameru ponechať,SampleSceneChild vymažete tohto zvukového poslucháča.

Zmena kamery tak, aby zobrazovala dve scény

Pokiaľ ide o príčinu, že pri pridávaní podradenej scény sa zobrazuje iba plátno detskej scény, Je to preto, že na plátne sú umiestnené dve kamery, nadradená scéna a detská scéna a zobrazuje sa iba jedna kamera.

Riešením je zobraziť plátno oboch scén kamerou nadradenej scény. Proces spočíva v nahradení kamery na plátne detskej scény kamerou nadradenej scény po pridaní detskej scény.

Poďme vytvoriť skript. Názov je ľubovoľný, ale v tomto prípade ChildSceneCamera je to .

Skript vyzerá takto: Canvas Je to nevyhnutný proces, ktorý sa má pripojiť k .

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 Metóda sa vykoná pri prvej existencii objektu v scéne. Start Vykonáva sa pred metódou. Je dobré si uvedomiť, že ho často používate. Tentoraz sa predpokladá, že sa vykoná po pridaní podradenej scény.

/// <summary>シーンに追加されたタイミングで処理されます。</summary>
void Awake()
{
  // 処理
}

Získajte plátno nadradenej scény a plátno detskej scény, ktoré nahradia fotoaparát. Existujú rôzne spôsoby, ako to urobiť, ale nie je to hlavná téma, takže si môžete myslieť, že to môžete získať, ak to zatiaľ urobíte týmto spôsobom.

// 親のシーンのキャンバスを取得
var parentScene = SceneManager.GetSceneByName("SampleSceneParent");
var parentCanvas = parentScene.GetRootGameObjects().First(obj => obj.GetComponent<Canvas>() != null).GetComponent<Canvas>();

// 子のシーンのキャンバスを取得
var childCanvas = GetComponent<Canvas>();

Najskôr zničte kameru Object.Destroy detskej scény. Aj keď je preč, nie je problém, pretože ho môže zakryť kamera rodičovskej scény. Cieľ Canvas.worldCamera odstránenia sa načíta z . Je to len preto, že rovnaká kamera, ktorú má scéna v tomto bode, je nastavená a dá sa ľahko získať. Ak ho skutočne chcete odstrániť, radšej získajte fotoaparát zo scény.

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

Nakoniec je detská scéna Canvas.worldCamera nahradená kamerou rodiča.

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

Po SampleSceneChild uložení skriptu ho priložte k súboru . Canvas

Je v poriadku, ak je výsledok vykonania a pridania podradenej scény taký, ako je znázornené na obrázku nižšie. Uistite sa, že tam nie sú žiadne protokoly.