Een scène toevoegen

Pagina bijgewerkt :
Aanmaakdatum van pagina :

Verificatieomgeving

Ramen
  • Voor Windows 11
Unity Editor
  • 2020.3.25f1
Input systeem pakket
  • 1.2.0

Vereisten voor deze tip

De volgende instellingen zijn vooraf gemaakt als uitgangspunt voor de beschrijving van deze tip.

Een scène toevoegen

Met Unity kunt u meerdere scènes tegelijkertijd weergeven. Gebruik het wanneer u scènes wilt overlayen of uw tekeningen naar een andere structuur wilt exporteren.

Deze keer wil ik de boven elkaar geplaatste weergave van de scène uitleggen, ervan uitgaande dat het menuscherm op de voorgrond wordt weergegeven terwijl het spel wordt uitgevoerd terwijl het spel wordt uitgevoerd.

Wanneer u meerdere scènes weergeeft, moet u rekening houden met het volgende:

  • Er mag niet meer dan één EventSystem zijn
  • Er mag niet meer dan één audioluisteraar zijn
  • Wees voorzichtig bij het hanteren van meerdere camera's

Bereid de scène voor

Deze keer bereiden we twee scènes voor. Let be , en SampleSceneParentde scène SampleSceneChild die extra moet worden weergegeven is . De methode om twee scènes voor te bereiden is hetzelfde als de vorige tips, dus raadpleeg ze.

Deze keer maken we de volgende lay-out. Als u op de knop in de bovenliggende scène klikt, is er geen probleem, behalve om de onderliggende scène toe te voegen. en sprites worden geplaatst om het gemakkelijker te maken om de symptomen te Canvas begrijpen die u later zult zien.

SampleSceneParent

VoorbeeldSceneChild

Wanneer meerdere scènes worden weergegeven, is de context van de objecten afhankelijk van de "laagvolgorde" van elk object, ongeacht de scène-eenheid. Aangezien de beginwaarden allemaal 0 zijn, laat u SampleSceneChild Canvas de no en sprites ingesteld op "1".

Vergeet niet om de twee scènes in de build-instellingen in te stellen.

Scènes verwerken

Het wordt verwerkt in code op dezelfde manier als het schakelen tussen scènes. Ook deze keer wordt het verwerkt wanneer op de knop wordt geklikt, maar het wordt verwerkt als een toevoeging in plaats van een scèneschakelaar.

De naam van het scriptbestand is willekeurig, maar hier SceneAdd is het .

Het script ziet er als volgt uit:

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

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

Bij het wisselen van scènes LoadSceneMode stel ik in op , Single maar deze keer Additive is het . Dat is alles wat er is aan het verschil.

Nadat SampleSceneParent u het script hebt opgeslagen, koppelt u het aan . EventSystem

Stel de methode in op de OnClick knop.

Probeer het spel uit te voeren om te zien hoe het werkt. Als u op de knop klikt, ziet u de onderliggende scène.

Als je naar de hiërarchie kijkt, zie je ook dat er twee scènes zijn.

Ondanks het feit dat de scène is toegevoegd, lijkt het erop dat de inhoud van het canvas van de bovenliggende scène niet wordt weergegeven. Omgekeerd kunt u zien dat de sprites in de bovenliggende scène aan de achterkant worden weergegeven volgens de volgorde van de lagen.

Als je naar de console kijkt, kun je ook zien dat de logboeken constant worden uitgevoerd.

De inhoud is de volgende twee punten.

  • Er zijn 2 evenementensystemen in de scene. Zorg ervoor dat er altijd precies één evenementensysteem in de scène is
  • Er zijn 2 audioluisteraars in de scène. Zorg ervoor dat er altijd precies één audioluisteraar in de scène is.

Bij het gebruik van meerdere scènes is het noodzakelijk om overeen te komen met deze twee punten en de camera.

EventSystem-fouten oplossen

De inhoud van het logboek is als volgt.

Er zijn 2 evenementensystemen in de scene. Zorg ervoor dat er altijd precies één evenementensysteem in de scène is

(Er zijn twee gebeurtenissystemen in de scène.) Zorg ervoor dat je altijd één evenementensysteem in je scène hebt)

Zoals geschreven, zal het combineren van het EventSystem in één oplossing het probleem oplossen.

SampleSceneParent wordt verondersteld altijd te bestaan,SampleSceneChild dus verwijder het wanneer EventSystem u het opent.

Houd er natuurlijk rekening mee dat als u alleen uitvoert,SampleSceneChild de gebruikersinterface zoals knoppen niet werkt.

U kunt zien dat de logboeken van het EventSystem zijn verdwenen wanneer u het uitvoert.

SampleSceneParent Omdat het aanwezig isEventSystem, kunnen ook de knoppen in de onderliggende scène worden geactiveerd.

Fouten met AudioListeners oplossen

De inhoud van het logboek is als volgt.

Er zijn 2 audioluisteraars in de scène. Zorg ervoor dat er altijd precies één audioluisteraar in de scène is.

(Er zijn twee audioluisteraars in de scène.) Zorg ervoor dat er te allen tijde slechts één audioluisteraar in de scène aanwezig is. )

Main Camera Als u naar de componenten van kijkt, kunt u zeker zien dat de audioluisteraar bestaat, dus SampleSceneChild u kunt de audioluisteraar verwijderen in . Het kan worden opgelost door camerabesturing van het volgende item, dus we zullen het daar behandelen.

Als u de camera wilt behouden,SampleSceneChild verwijdert u deze audioluisteraar.

De camera wijzigen om twee scènes weer te geven

Wat betreft de oorzaak dat alleen het canvas van de onderliggende scène wordt weergegeven bij het toevoegen van een onderliggende scène, Dit komt omdat er twee camera's zijn, de bovenliggende scène en de onderliggende scène op het canvas, en er wordt slechts één camera weergegeven.

De oplossing hiervoor is om het canvas van beide scènes weer te geven met de camera van de bovenliggende scène. Het proces is om de camera op het canvas van de onderliggende scène te vervangen door de camera van de bovenliggende scène nadat de onderliggende scène is toegevoegd.

Laten we een script maken. De naam is arbitrair, maar in dit geval ChildSceneCamera is het .

Het script ziet er als volgt uit: Canvas Het is een voorwaardelijk proces om aan te hechten.

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 De methode wordt uitgevoerd wanneer het object voor het eerst in de scène bestaat. Start Wordt uitgevoerd vóór de methode. Het is goed om te onthouden dat je het vaak gebruikt. Deze keer wordt aangenomen dat het zal worden uitgevoerd wanneer de onderliggende scène wordt toegevoegd.

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

Haal het bovenliggende scènecanvas en het onderliggende scènecanvas op om de camera te vervangen. Er zijn verschillende manieren om het te doen, maar het is niet het hoofdonderwerp, dus je kunt denken dat je het kunt krijgen als je het voorlopig op deze manier doet.

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

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

Vernietig eerst de camera Object.Destroy van de kinderscène. Zelfs als het weg is, is er geen probleem omdat het kan worden bedekt door de camera van de scène van de ouder. Het verwijderingsdoel Canvas.worldCamera wordt opgehaald uit . Het is gewoon omdat dezelfde camera die de scène op dit moment heeft, is ingesteld en gemakkelijk kan worden verkregen. Als je het echt wilt verwijderen, kun je beter de camera van de scène halen.

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

Ten slotte wordt de onderliggende scène Canvas.worldCamera vervangen door de camera van de ouder.

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

Nadat SampleSceneChild u het script hebt opgeslagen, koppelt u het aan . Canvas

Het is OK als het resultaat van het uitvoeren en toevoegen van een onderliggende scène is zoals weergegeven in de onderstaande afbeelding. Zorg ervoor dat er ook geen logboeken zijn.