Tilføj en scene

Side opdateret :
Dato for oprettelse af side :

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