Lägga till en scen

Sidan uppdaterad :
Datum för skapande av sida :

Verifiering miljö

Windows
  • Fönster 11
Unity-redaktör
  • 2020.3.25F1
Paket för inmatningssystem
  • 1.2.0

Förutsättningar för det här tipset

Följande inställningar har gjorts i förväg som en förutsättning för beskrivningen av detta tips.

Om att lägga till en scen

Med Unity kan du visa flera scener samtidigt. Använd den när du bara vill lägga över scener eller exportera dina ritningar till en annan struktur.

Den här gången skulle jag vilja förklara den överlagrade visningen av scenen förutsatt att menyskärmen visas i förgrunden medan spelet körs medan spelet körs.

När du visar flera scener bör du vara medveten om följande:

  • Det får inte finnas mer än ett EventSystem
  • Det får inte finnas mer än en ljudlyssnare
  • Var försiktig när du hanterar flera kameror

Förbered scenen

Den här gången kommer vi att förbereda två scener. Låt vara , och SampleSceneParentscenen SampleSceneChild som ska visas dessutom är . Metoden för att förbereda två scener är densamma som de tidigare tipsen, så se dem.

Den här gången skapar vi följande layout. Om du klickar på knappen i den överordnade scenen är det inga problem förutom att lägga till den underordnade scenen. Och sprites placeras för att göra det lättare att Canvas förstå symptomen som du kommer att se senare.

SampleSceneParent

SampleSceneChild

När flera scener visas beror objektens kontext på varje objekts "lagerordning", oavsett scenenhet. Eftersom de ursprungliga värdena alla är 0 låter SampleSceneChild Canvas du no och sprites vara inställda på "1".

Glöm inte att ställa in de två scenerna i bygginställningarna.

Bearbetar scener

Den bearbetas i kod på samma sätt som att byta scener. Även den här gången bearbetas den när du klickar på knappen, men den bearbetas som ett tillägg istället för en scenomkopplare.

Namnet på skriptfilen är godtyckligt, men här SceneAdd är det .

Skriptet ser ut så här:

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

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

När jag byter scen LoadSceneMode ställer jag in på , Single men den här gången Additive är det . Det är allt som finns i skillnaden.

När du har SampleSceneParent sparat skriptet kopplar du det till . EventSystem

Ställ in metoden på OnClick knappen.

Prova att köra spelet för att se hur det fungerar. Om du klickar på knappen ser du barnscenen.

Om du tittar på hierarkin kan du också se att det finns två scener.

Trots att scenen har lagts till verkar det som om innehållet i den överordnade scenens duk inte visas. Omvänt kan du se att sprites i den överordnade scenen visas på baksidan enligt lagrens ordning.

Om du tittar på konsolen kan du också se att loggarna ständigt matas ut.

Innehållet är följande två punkter.

  • Det finns 2 händelsesystem i scenen. Se till att det alltid finns exakt ett händelsesystem på scenen
  • Det finns 2 ljudlyssnare i scenen. Se till att det alltid finns exakt en ljudlyssnare i scenen.

När du använder flera scener är det nödvändigt att motsvara dessa två punkter och kameran.

Åtgärda EventSystem-fel

Innehållet i loggen är som följer.

Det finns 2 händelsesystem i scenen. Se till att det alltid finns exakt ett händelsesystem på scenen

(Det finns två händelsesystem i scenen.) Se till att du alltid har ett händelsesystem i din scen)

Som skrivet kommer att kombinera EventSystem till en lösning lösa problemet.

SampleSceneParent antas alltid finnas,SampleSceneChild så ta bort det när EventSystem du öppnar det.

Observera naturligtvis att om du kör av sig självSampleSceneChild fungerar inte användargränssnittet som knappar.

Du kan se att EventSystem-loggarna har försvunnit när du kör den.

SampleSceneParent Eftersom är EventSystem närvarande kan knapparna i barnscenen aktiveras.

Åtgärda AudioListeners fel

Innehållet i loggen är som följer.

Det finns 2 ljudlyssnare i scenen. Se till att det alltid finns exakt en ljudlyssnare i scenen.

(Det finns två ljudlyssnare i scenen.) Se till att det bara finns en ljudlyssnare i scenen hela tiden. )

Main Camera Om du tittar på komponenterna i kan du säkert se att Ljudlyssnare finns, så SampleSceneChild du kan ta bort Ljudlyssnare i . Det kan lösas genom kamerakontroll av nästa objekt, så vi kommer att hantera det där.

Om du vill behålla kameranSampleSceneChild tar du bort den här ljudlyssnaren.

Ändra kameran så att två scener visas

När det gäller orsaken till att endast duken på barnscenen visas när du lägger till en barnscen, Det beror på att det finns två kameror, den överordnade scenen och den underordnade scenen på arbetsytan, och endast en kamera visas.

Lösningen på detta är att visa duken för båda scenerna med kameran på den överordnade scenen. Processen är att ersätta kameran på den underordnade scenens arbetsyta med den överordnade scenens kamera efter att den underordnade scenen har lagts till.

Låt oss skapa ett skript. Namnet är godtyckligt, men i det här fallet ChildSceneCamera är det .

Skriptet ser ut så här: Canvas Det är en nödvändig process att koppla till .

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 Metoden körs första gången objektet finns i scenen. Start Körs före metoden. Det är bra att komma ihåg att du ofta använder det ofta. Den här gången antas det att det kommer att köras när barnscenen läggs till.

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

Hämta den överordnade scenarbetsytan och den underordnade scenarbetsytan för att ersätta kameran. Det finns olika sätt att göra det, men det är inte huvudämnet, så du kan tro att du kan få det om du gör det på det här sättet för tillfället.

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

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

Förstör barnscenens kamera Object.Destroy först. Även om den är borta är det inga problem eftersom den kan täckas av kameran på föräldrarnas scen. Borttagningsmålet Canvas.worldCamera hämtas från . Det är bara för att samma kamera som scenen har vid denna tidpunkt är inställd och lätt kan förvärvas. Om du faktiskt vill ta bort det, borde du få kameran från scenen.

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

Slutligen ersätts barnscenen Canvas.worldCamera med förälderns kamera.

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

När du har SampleSceneChild sparat skriptet kopplar du det till . Canvas

Det är OK om resultatet av att köra och lägga till en underordnad scen är som visas i bilden nedan. Se till att det inte finns några loggar heller.