Přidání scény

Stránky aktualizovány :
Datum vytvoření stránky :

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ě, SampleSceneParentje . 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ší.

SampleSceneParentse 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.