Pridanie scény
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énaSampleSceneParent
SampleSceneChild
, 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.