Stseeni lisamine

Lehekülg uuendatud :
Lehe loomise kuupäev :

Kontrollimise keskkond

Windows
  • Windows 11
Ühtsuse toimetaja
  • 2020.3.25f1
Sisendsüsteemi pakett
  • 1.2.0

Selle näpunäite eeltingimused

Selle vihje kirjeldamise eelduseks on eelnevalt tehtud järgmised sätted.

Teave stseeni lisamise kohta

Unity võimaldab teil kuvada korraga mitu stseeni. Kasutage seda siis, kui soovite lihtsalt stseene üle katta või eksportida oma joonised erineva tekstuuriga.

Seekord tahaksin selgitada stseeni pealmist kuvamist, eeldades, et menüüekraan kuvatakse esiplaanil, kui mäng töötab, kui mäng töötab.

Mitme stseeni kuvamisel peaksite teadma järgmist.

  • Ei tohi olla rohkem kui üks EventSystem
  • Heli kuulajaid ei tohi olla rohkem kui üks
  • Olge mitme kaamera käsitsemisel ettevaatlik

Valmistage stseen ette

Seekord valmistame ette kaks stseeni. Las olla , ja SampleSceneParentlisaks kuvatav stseen SampleSceneChild on . Kahe stseeni ettevalmistamise meetod on sama, mis eelmistel näpunäidetel, nii et palun vaadake neid.

Seekord loome järgmise paigutuse. Kui klõpsate emastseenis nuppu, pole probleemi, välja arvatud lapsestseeni lisamine. ja spraidid on paigutatud selleks, et hiljem nähtavaid sümptomeid oleks lihtsam Canvas mõista.

SampleSceneParent

SampleSceneChild

Kui kuvatakse mitu stseeni, sõltub objektide kontekst iga objekti "kihilisest järjestusest", olenemata stseeniüksusest. Kuna algväärtused on kõik 0, jätke SampleSceneChild Canvas no ja spraidid väärtuseks "1".

Ärge unustage seada need kaks stseeni järgusätetes.

Stseenide töötlemine

Seda töödeldakse koodis samamoodi nagu stseenide vahetamist. Ka seekord töödeldakse seda nupu klõpsamisel, kuid seda töödeldakse stseeni lüliti asemel lisana.

Skriptifaili nimi on meelevaldne, kuid siin SceneAdd see on .

Skript näeb välja selline:

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

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

Stseenide vahetamisel LoadSceneMode seadsin , Single kuid seekord Additive on see . See on kõik, mis seal on erinevuseks.

Pärast SampleSceneParent skripti salvestamist manustage see . EventSystem

Seadke meetod nupule OnClick .

Proovige mängu käivitada, et näha, kuidas see töötab. Kui klõpsate nuppu, näete lapse stseeni.

Samuti, kui vaatate hierarhiat, näete, et seal on kaks stseeni.

Vaatamata sellele, et stseen on lisatud, tundub, et vanema stseeni lõuendi sisu ei kuvata. Vastupidi, näete, et emastseeni spraidid kuvatakse tagaküljel vastavalt kihtide järjekorrale.

Samuti, kui vaatate konsooli, näete, et logid väljastatakse pidevalt.

Sisu on järgmised kaks punkti.

  • Stseenis on 2 sündmuste süsteemi. Palun veenduge, et sündmuskohal oleks alati täpselt üks sündmuste süsteem
  • Stseenis on 2 heli kuulajat. Palun veenduge, et stseenis oleks alati täpselt üks heli kuulaja.

Mitme stseeni kasutamisel on vaja vastata nendele kahele punktile ja kaamerale.

EventSystemi vigade parandamine

Logi sisu on järgmine.

Stseenis on 2 sündmuste süsteemi. Palun veenduge, et sündmuskohal oleks alati täpselt üks sündmuste süsteem

(Stseenis on kaks sündmuste süsteemi.) Veenduge, et teie stseenis oleks alati üks sündmuste süsteem)

Nagu kirjutatud, lahendab probleemi EventSystemi ühendamine üheks lahenduseks.

SampleSceneParent eeldatakse, et see on alati olemas,SampleSceneChild nii et kustutage see selle avamisel EventSystem .

Muidugi pange tähele, et kui käivitate iseenesest, ei tööta kasutajaliides,SampleSceneChild näiteks nupud.

Näete, et sündmusesüsteemi logid on selle käivitamisel kadunud.

SampleSceneParent Samuti, kuna see on EventSystem olemas, saab lapse stseeni nuppe aktiveerida.

AudioListenersi vigade parandamine

Logi sisu on järgmine.

Stseenis on 2 heli kuulajat. Palun veenduge, et stseenis oleks alati täpselt üks heli kuulaja.

(Stseenis on kaks helikuulajat.) Veenduge, et stseenis oleks kogu aeg ainult üks helikuulaja. )

Main Camera Kui vaatate komponente , näete kindlasti, et Audio Listener on olemas, nii et SampleSceneChild saate Audio Listeneri kustutada . Seda saab lahendada järgmise elemendi kaamerajuhtimisega, nii et me tegeleme sellega seal.

Kui soovite kaamera alles jätta,SampleSceneChild kustutate selle Audio Listeneri.

Kaamera vahetamine kahe stseeni kuvamiseks

Mis puutub põhjusse, et lapse stseeni lisamisel kuvatakse ainult lapse stseeni lõuend, Seda seetõttu, et lõuendil on kaks kaamerat, vanem stseen ja lapse stseen ning kuvatakse ainult üks kaamera.

Selle lahenduseks on mõlema stseeni lõuendi kuvamine vanema stseeni kaameraga. Protsess on lapse stseeni lõuendil oleva kaamera asendamine vanema stseeni kaameraga pärast lapse stseeni lisamist.

Loome skripti. Nimi on meelevaldne, kuid sel juhul ChildSceneCamera on see .

Skript näeb välja selline: Canvas See on eeltingimus protsess, mida lisada .

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 Meetod käivitatakse esimest korda, kui objekt stseenis eksisteerib. Start Käivitab enne meetodit. Hea on meeles pidada, et kasutate seda sageli. Seekord eeldatakse, et see täidetakse siis, kui lisatakse lapse stseen.

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

Hankige kaamera asemele emastseeni lõuend ja tütarstseeni lõuend. Selleks on mitmeid viise, kuid see ei ole peamine teema, nii et võite arvata, et saate selle, kui teete seda praegu nii.

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

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

Hävitage kõigepealt lapse stseeni kaamera Object.Destroy . Isegi kui see on kadunud, pole probleemi, sest seda saab katta vanema stseeni kaameraga. Kustutamise sihtmärk Canvas.worldCamera tuuakse aadressilt . See on lihtsalt sellepärast, et sama kaamera, mis stseenil sel hetkel on, on seatud ja seda saab hõlpsasti omandada. Kui soovite selle tegelikult kustutada, peaksite parem kaamera sündmuskohalt hankima.

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

Lõpuks asendatakse lapse stseen Canvas.worldCamera vanema kaameraga.

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

Pärast SampleSceneChild skripti salvestamist manustage see . Canvas

See on OK, kui lapse stseeni täitmise ja lisamise tulemus on selline, nagu on näidatud alloleval joonisel. Veenduge, et ka logisid poleks.