Tilføj en scene
Miljø til bekræftelse
- Windows
-
- Windows 11
- Enhedslistens redaktør
-
- 2020.3.25f1
- Input System Pakke
-
- 1.2.0
Forudsætninger for dette tip
Følgende indstillinger er foretaget på forhånd som en forudsætning for beskrivelsen af dette tip.
Om tilføjelse af en scene
Unity giver dig mulighed for at vise flere scener på samme tid. Brug det, når du blot vil overlejre scener eller eksportere dine tegninger til en anden tekstur.
Denne gang vil jeg gerne forklare den overlejrede visning af scenen, forudsat at menuskærmen vises i forgrunden, mens spillet kører, mens spillet kører.
Når du viser flere scener, skal du være opmærksom på følgende:
- Der må ikke være mere end ét EventSystem
- Der må ikke være mere end én lydlytter
- Vær forsigtig, når du håndterer flere kameraer
Forbered scenen
Denne gang forbereder vi to scener. Lad være , og SampleSceneParent
scenen SampleSceneChild
, der skal vises yderligere, er .
Metoden til at forberede to scener er den samme som de foregående tip, så se dem.
Denne gang opretter vi følgende layout. Hvis du klikker på knappen i den overordnede scene, er der ikke andet problem end at tilføje barnescenen.
og sprites er placeret for at gøre det lettere at Canvas
forstå de symptomer, som du vil se senere.
SampleSceneParent
SampleSceneChild
Når der vises flere scener, afhænger objekternes kontekst af "lagrækkefølgen" for hvert objekt, uanset sceneenheden.
Da startværdierne alle er 0, skal du lade SampleSceneChild
Canvas
nej og sprites være indstillet til "1".
Glem ikke at indstille de to scener i build-indstillingerne.
Behandling af scener
Det behandles i kode på samme måde som at skifte scene. Også denne gang behandles det, når der klikkes på knappen, men det behandles som en tilføjelse i stedet for en sceneskift.
Navnet på scriptfilen er vilkårlig, men her SceneAdd
er det .
Scriptet ser sådan ud:
using UnityEngine;
using UnityEngine.SceneManagement; // 追加
public class SceneAdd : MonoBehaviour
{
<summary>ボタンをクリックしたときに呼ばれます。</summary>
public void OnClick()
{
// 指定したシーンを追加します
SceneManager.LoadScene("SampleSceneChild", LoadSceneMode.Additive);
}
}
Når jeg skifter scene, indstiller jeg til , LoadSceneMode
Single
men denne gang Additive
er det .
Det er alt, hvad der er til forskellen.
Når SampleSceneParent
du har gemt scriptet, skal du vedhæfte det til . EventSystem
Indstil metoden på knappen OnClick
.
Prøv at køre spillet for at se, hvordan det fungerer. Hvis du klikker på knappen, vil du se barnescenen.
Hvis du ser på hierarkiet, kan du også se, at der er to scener.
På trods af at scenen er blevet tilføjet, ser det ud til, at indholdet af forældrescenens lærred ikke vises. Omvendt kan du se, at sprites i forældrescenen vises på bagsiden i henhold til lagenes rækkefølge.
Hvis du ser på konsollen, kan du også se, at logfilerne konstant udsendes.
Indholdet er følgende to punkter.
- Der er 2 begivenhedssystemer i scenen. Sørg for, at der altid er nøjagtigt et begivenhedssystem i scenen
- Der er 2 lydlyttere i scenen. Sørg for, at der altid er nøjagtigt én lydlytter i scenen.
Når du bruger flere scener, er det nødvendigt at svare til disse to punkter og kameraet.
Ret EventSystem-fejl
Indholdet af loggen er som følger.
Der er 2 begivenhedssystemer i scenen. Sørg for, at der altid er nøjagtigt et begivenhedssystem i scenen
(Der er to hændelsessystemer i scenen.) Sørg for, at du altid har ét hændelsessystem i din scene)
Som skrevet vil kombinationen af EventSystem i én løsning løse problemet.
SampleSceneParent
antages altid at eksistere, så slet den,SampleSceneChild
når EventSystem
du åbner den.
Bemærk selvfølgelig, at hvis du kører af sig selv,SampleSceneChild
fungerer brugergrænsefladen såsom knapper ikke.
Du kan se, at EventSystem-logfilerne er forsvundet, når du kører det.
SampleSceneParent
Da er EventSystem
til stede, kan knapperne i barnescenen også aktiveres.
Ret AudioListeners-fejl
Indholdet af loggen er som følger.
Der er 2 lydlyttere i scenen. Sørg for, at der altid er nøjagtigt én lydlytter i scenen.
(Der er to lydlyttere i scenen.) Sørg for, at der altid kun er én lydlytter i scenen. )
Main Camera
Hvis du ser på komponenterne i , kan du helt sikkert se, at Audio Listener findes, så SampleSceneChild
du kan slette Audio Listener i .
Det kan løses ved kamerastyring af næste punkt, så vi behandler det der.
Hvis du vil beholde kameraet,SampleSceneChild
sletter du denne lydlytter.
Skift kameraet til at vise to scener
Hvad angår årsagen til, at kun lærredet i barnescenen vises, når du tilføjer en barnescene, Dette skyldes, at der er to kameraer, den overordnede scene og den underordnede scene indstillet på lærredet, og kun ét kamera vises.
Løsningen på dette er at vise lærredet i begge scener med kameraet på forældrescenen. Processen er at erstatte kameraet på barnescenens lærred med den overordnede scenes kamera, når den underordnede scene er tilføjet.
Lad os oprette et script. Navnet er vilkårligt, men i dette tilfælde ChildSceneCamera
er det .
Scriptet ser sådan ud: Canvas
Det er en forudsætning proces at knytte til .
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 udføres første gang objektet findes i scenen. Start
Udføres før metoden.
Det er godt at huske, at du ofte bruger det ofte.
Denne gang antages det, at det vil blive udført, når barnescenen tilføjes.
<summary>シーンに追加されたタイミングで処理されます。</summary>
void Awake()
{
// 処理
}
Få det overordnede scenelærred og det underordnede scenelærred til at erstatte kameraet. Der er forskellige måder at gøre det på, men det er ikke hovedemnet, så du kan tro, at du kan få det, hvis du gør det på denne måde for øjeblikket.
// 親のシーンのキャンバスを取得
var parentScene = SceneManager.GetSceneByName("SampleSceneParent");
var parentCanvas = parentScene.GetRootGameObjects().First(obj => obj.GetComponent<Canvas>() != null).GetComponent<Canvas>();
// 子のシーンのキャンバスを取得
var childCanvas = GetComponent<Canvas>();
Ødelæg børnescenens kamera Object.Destroy
først. Selvom det er væk, er der ikke noget problem, fordi det kan dækkes af kameraet på forældrenes scene.
Sletningsmålet Canvas.worldCamera
hentes fra .
Det er bare fordi det samme kamera, som scenen har på dette tidspunkt, er indstillet og let kan erhverves.
Hvis du faktisk vil slette det, skal du hellere hente kameraet fra scenen.
// 子のシーンのカメラを削除
Object.Destroy(childCanvas.worldCamera.gameObject);
Endelig erstattes barnescenen Canvas.worldCamera
med forældrenes kamera.
// 子のシーンのキャンバスのカメラを親のシーンのカメラに置き換えます
childCanvas.worldCamera = parentCanvas.worldCamera;
Når SampleSceneChild
du har gemt scriptet, skal du vedhæfte det til . Canvas
Det er OK, hvis resultatet af at udføre og tilføje en underordnet scene er som vist i nedenstående figur. Sørg for, at der heller ikke er logfiler.