Lägga till en scen
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 SampleSceneParent
scenen 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.