Přidání scény
Ověřovací prostředí
- Windows
-
- Systém Windows 11
- Editor jednoty
-
- 2020.3.25f1
- Vstupní systémový balíček
-
- 1.2.0
Předpoklady pro tento tip
Následující nastavení byla provedena předem jako předpoklad pro popis tohoto tipu.
O přidání scény
Unity umožňuje zobrazit více scén najednou. Použijte jej, když chcete jednoduše překrýt scény nebo exportovat kresby do jiné textury.
Tentokrát bych rád vysvětlil překrývající se zobrazení scény za předpokladu, že obrazovka nabídky je zobrazena v popředí, zatímco hra běží, zatímco hra běží.
Při zobrazování více scén byste si měli být vědomi následujících skutečností:
- Nesmí existovat více než jeden EventSystem
- Nesmí existovat více než jeden posluchač zvuku
- Buďte opatrní při manipulaci s více kamerami
Připravte scénu
Tentokrát si připravíme dvě scény. Nechť je , a scénaSampleSceneChild
, která má být zobrazena dodatečně, SampleSceneParent
je .
Způsob přípravy dvou scén je stejný jako předchozí tipy, proto se na ně prosím podívejte.
Tentokrát vytvoříme následující rozložení. Pokud kliknete na tlačítko v rodičovské scéně, není problém kromě přidání podřízené scény.
A skřítci jsou umístěni, aby bylo snazší Canvas
porozumět příznakům, které uvidíte později.
SampleSceneParent
SampleSceneChild
Při zobrazení více scén závisí kontext objektů na "pořadí vrstev" každého objektu, bez ohledu na jednotku scény.
Vzhledem k tomu, že počáteční hodnoty jsou všechny 0, ponechte SampleSceneChild
Canvas
no a sprites nastavené na "1".
Nezapomeňte nastavit dvě scény v nastavení sestavení.
Zpracování scén
Zpracovává se v kódu stejným způsobem jako přepínání scén. I tentokrát se zpracovává při kliknutí na tlačítko, ale místo přepínání scén se zpracovává jako doplněk.
Název souboru skriptu je libovolný, ale tady SceneAdd
je .
Skript vypadá takto:
using UnityEngine;
using UnityEngine.SceneManagement; // 追加
public class SceneAdd : MonoBehaviour
{
<summary>ボタンをクリックしたときに呼ばれます。</summary>
public void OnClick()
{
// 指定したシーンを追加します
SceneManager.LoadScene("SampleSceneChild", LoadSceneMode.Additive);
}
}
Při přepínání scén LoadSceneMode
jsem nastavil na , Single
ale tentokrát Additive
je .
To je vše, co je v tom rozdílu.
Po SampleSceneParent
uložení skriptu jej připojte k rozhraní . EventSystem
Nastavte metodu na tlačítku OnClick
.
Zkuste hru spustit, abyste zjistili, jak funguje. Pokud kliknete na tlačítko, uvidíte dětskou scénu.
Také, pokud se podíváte na hierarchii, můžete vidět, že existují dvě scény.
Navzdory skutečnosti, že scéna byla přidána, zdá se, že obsah základní stránky nadřazené scény není zobrazen. Naopak můžete vidět, že skřítci v rodičovské scéně jsou zobrazeni na zadní straně podle pořadí vrstev.
Také, pokud se podíváte na konzolu, můžete vidět, že protokoly jsou neustále výstupní.
Obsahem jsou následující dva body.
- Na scéně jsou 2 systémy událostí. Ujistěte se, že na scéně je vždy přesně jeden systém událostí
- Na scéně jsou 2 posluchači zvuku. Ujistěte se, že ve scéně je vždy přesně jeden posluchač zvuku.
Při použití více scén je nutné odpovídat těmto dvěma bodům a kameře.
Oprava chyb EventSystem
Obsah protokolu je následující.
Na scéně jsou 2 systémy událostí. Ujistěte se, že na scéně je vždy přesně jeden systém událostí
(Na scéně jsou dva systémy událostí.) Ujistěte se, že máte ve scéně vždy jeden systém událostí)
Jak je psáno, spojení EventSystem do jednoho řešení problém vyřeší.
SampleSceneParent
se předpokládá, že vždy existuje, proto jej EventSystem
při otevření odstraňte.SampleSceneChild
Samozřejmě mějte na paměti, že pokud spustíte sám, uživatelské rozhraní, jako jsou tlačítka,SampleSceneChild
nebude fungovat.
Můžete vidět, že protokoly EventSystem zmizely při jeho spuštění.
SampleSceneParent
Také, protože je EventSystem
přítomen, tlačítka v dětské scéně mohou být aktivována.
Oprava chyb AudioListeners
Obsah protokolu je následující.
Na scéně jsou 2 posluchači zvuku. Ujistěte se, že ve scéně je vždy přesně jeden posluchač zvuku.
(Ve scéně jsou dva posluchači zvuku.) Ujistěte se, že je ve scéně vždy pouze jeden posluchač zvuku. )
Main Camera
Pokud se podíváte na komponenty programu , určitě uvidíte, že zvukový posluchač existuje, takže SampleSceneChild
jej můžete odstranit v .
Dá se to řešit kamerovým ovládáním další položky, tak se tím budeme zabývat tam.
Pokud chcete kameru zachovat,SampleSceneChild
odstraníte tento posluchač zvuku.
Změna fotoaparátu tak, aby zobrazoval dvě scény
Pokud jde o příčinu, že při přidávání podřízené scény se zobrazí pouze plátno podřízené scény, Je to proto, že na plátně jsou dvě kamery, nadřazená scéna a podřízená scéna, a zobrazí se pouze jedna kamera.
Řešením je zobrazení plátna obou scén s kamerou nadřazené scény. Postup spočívá v nahrazení kamery na plátně podřízené scény kamerou nadřazené scény po přidání podřízené scény.
Pojďme vytvořit skript. Název je libovolný, ale v tomto případě ChildSceneCamera
je .
Skript vypadá takto: Canvas
Je to nezbytný proces, který se má připojit k rozhraní .
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
Metoda se spustí při prvním výskytu objektu ve scéně. Start
Spustí se před metodou.
Je dobré si uvědomit, že ji často používáte.
Tentokrát se předpokládá, že bude proveden při přidání podřízené scény.
<summary>シーンに追加されたタイミングで処理されます。</summary>
void Awake()
{
// 処理
}
Získejte plátno rodičovské scény a plátno podřízené scény pro nahrazení kamery. Existují různé způsoby, jak to udělat, ale není to hlavní téma, takže si můžete myslet, že to můžete získat, pokud to uděláte tímto způsobem.
// 親のシーンのキャンバスを取得
var parentScene = SceneManager.GetSceneByName("SampleSceneParent");
var parentCanvas = parentScene.GetRootGameObjects().First(obj => obj.GetComponent<Canvas>() != null).GetComponent<Canvas>();
// 子のシーンのキャンバスを取得
var childCanvas = GetComponent<Canvas>();
Nejprve zničte kameru Object.Destroy
dětské scény. I když je pryč, není problém, protože může být pokryt kamerou rodičovské scény.
Cíl Canvas.worldCamera
odstranění je načten z .
Je to jen proto, že stejná kamera, kterou má scéna v tomto okamžiku, je nastavena a lze ji snadno získat.
Pokud jej skutečně chcete smazat, měli byste fotoaparát dostat ze scény.
// 子のシーンのカメラを削除
Object.Destroy(childCanvas.worldCamera.gameObject);
Nakonec je podřízená scéna Canvas.worldCamera
nahrazena rodičovskou kamerou.
// 子のシーンのキャンバスのカメラを親のシーンのカメラに置き換えます
childCanvas.worldCamera = parentCanvas.worldCamera;
Po SampleSceneChild
uložení skriptu jej připojte k rozhraní . Canvas
Je v pořádku, pokud je výsledek spuštění a přidání podřízené scény takový, jak je znázorněno na obrázku níže. Ujistěte se, že neexistují žádné protokoly.