Adăugarea unei scene

Pagina actualizată :
Data creării paginii :

Mediul de verificare

Windows
  • Ferestre 11
Unity Editor
  • 2020.3.25F1
Pachet sistem de intrare
  • 1.2.0

Cerințe preliminare pentru acest sfat

Următoarele setări au fost făcute în avans ca premisă pentru descrierea acestui sfat.

Despre adăugarea unei scene

Unity vă permite să afișați mai multe scene în același timp. Utilizați-l atunci când doriți pur și simplu să suprapuneți scene sau să exportați desenele pe o textură diferită.

De data aceasta, aș dori să explic afișarea suprapusă a scenei presupunând că ecranul meniului este afișat în prim-plan în timp ce jocul rulează în timp ce jocul rulează.

Când afișați mai multe scene, ar trebui să fiți conștienți de următoarele:

  • Nu trebuie să existe mai mult de un sistem de evenimente
  • Nu trebuie să existe mai mult de un ascultător audio
  • Aveți grijă atunci când manipulați mai multe camere

Pregătiți scena

De data aceasta, vom pregăti două scene. Fie , iar SampleSceneParentscena SampleSceneChild care va fi afișată suplimentar este . Metoda de pregătire a două scene este aceeași cu sfaturile anterioare, așa că vă rugăm să le consultați.

De data aceasta, vom crea următorul aspect. Dacă faceți clic pe butonul din scena părinte, nu există nicio problemă decât să adăugați scena fiu. Și sprite-urile sunt plasate pentru a facilita Canvas înțelegerea simptomelor pe care le veți vedea mai târziu.

SampleSceneParent

SampleSceneChild

Când sunt afișate mai multe scene, contextul obiectelor depinde de "ordinea straturilor" fiecărui obiect, indiferent de unitatea scenei. Deoarece valorile inițiale sunt toate 0, lăsați SampleSceneChild Canvas numărul și personajele setate la "1".

Nu uitați să setați cele două scene în setările de construire.

Procesarea scenelor

Este procesat în cod în același mod ca și comutarea scenelor. Și de data aceasta, este procesat atunci când se face clic pe buton, dar este procesat ca o adăugare în loc de un comutator de scenă.

Numele fișierului script este arbitrar, dar aici SceneAdd este .

Scenariul arată astfel:

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

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

Când schimb scenele, am setat la , LoadSceneMode Single dar de data Additive aceasta este . Asta e tot ce există în diferență.

După ce SampleSceneParent salvați scriptul, atașați-l la . EventSystem

Setați metoda pe OnClick buton.

Încercați să rulați jocul pentru a vedea cum funcționează. Dacă faceți clic pe buton, veți vedea scena copilului.

De asemenea, dacă te uiți la ierarhie, poți vedea că există două scene.

Cu toate acestea, în ciuda faptului că scena a fost adăugată, se pare că conținutul Planșei scenei părinte nu este afișat. În schimb, puteți vedea că personajele din scena părinte sunt afișate pe partea din spate în funcție de ordinea straturilor.

De asemenea, dacă vă uitați la consola, puteți vedea că jurnalele sunt în mod constant emise.

Conținutul este următoarele două puncte.

  • Există 2 sisteme de evenimente în scenă. Vă rugăm să vă asigurați că există întotdeauna exact un sistem de evenimente în scenă
  • Există 2 ascultători audio în scenă. Vă rugăm să vă asigurați că există întotdeauna exact un ascultător audio în scenă.

Atunci când utilizați mai multe scene, este necesar să corespundeți acestor două puncte și camerei.

Remediați erorile EventSystem

Conținutul jurnalului este după cum urmează.

Există 2 sisteme de evenimente în scenă. Vă rugăm să vă asigurați că există întotdeauna exact un sistem de evenimente în scenă

(Există două sisteme de evenimente în scenă.) Asigurați-vă că aveți întotdeauna un sistem de evenimente în scena dvs.)

După cum este scris, combinarea EventSystem într-o singură soluție va rezolva problema.

SampleSceneParent se presupune că există întotdeauna,SampleSceneChild așa că ștergeți-l când EventSystem îl deschideți.

Desigur, vă rugăm să rețineți că, dacă rulați singur, interfața de utilizare, cum ar fi butoanele,SampleSceneChild nu va funcționa.

Puteți vedea că jurnalele EventSystem au dispărut atunci când îl executați.

SampleSceneParent De asemenea, deoarece este EventSystem prezent, butoanele din scena copilului pot fi activate.

Remediați erorile AudioListeners

Conținutul jurnalului este după cum urmează.

Există 2 ascultători audio în scenă. Vă rugăm să vă asigurați că există întotdeauna exact un ascultător audio în scenă.

(Există doi ascultători audio în scenă.) Asigurați-vă că există un singur ascultător audio în scenă în orice moment. )

Main Camera Dacă vă uitați la componentele , puteți vedea cu siguranță că ascultătorul audio există, astfel încât SampleSceneChild să puteți șterge ascultătorul audio în . Poate fi rezolvată prin controlul camerei următorului articol, așa că ne vom ocupa de el acolo.

Dacă doriți să păstrați camera,SampleSceneChild veți șterge acest ascultător audio.

Schimbați camera pentru a afișa două scene

În ceea ce privește cauza pentru care numai pânza scenei copil este afișată atunci când adăugați o scenă copil, Acest lucru se datorează faptului că există două camere, scena părinte și scena copil setate pe pânză și este afișată o singură cameră.

Soluția la aceasta este afișarea pânzei ambelor scene cu camera scenei părinte. Procesul constă în înlocuirea camerei de pe pânza scenei copil cu camera scenei părinte după adăugarea scenei copil.

Să creăm un script. Numele este arbitrar, dar în acest caz ChildSceneCamera este .

Scenariul arată astfel: Canvas Este un proces preliminar de atașat la .

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 Metoda este executată prima dată când obiectul există în scenă. Start Se execută înainte de metodă. Este bine să vă amintiți că îl folosiți des. De data aceasta, se presupune că va fi executat atunci când se adaugă scena copilului.

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

Obțineți pânza scenei părinte și pânza scenei copil pentru a înlocui camera. Există mai multe modalități de a face acest lucru, dar nu este subiectul principal, așa că vă puteți gândi că îl puteți obține dacă îl faceți așa pentru moment.

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

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

Distrugeți mai întâi camera scenei Object.Destroy copilului. Chiar dacă a dispărut, nu există nicio problemă, deoarece poate fi acoperită de camera scenei părintelui. Ținta Canvas.worldCamera de ștergere este preluată din . Doar pentru că aceeași cameră pe care scena o are în acest moment este setată și poate fi achiziționată cu ușurință. Dacă doriți să o ștergeți, ar fi bine să scoateți camera din scenă.

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

În cele din urmă, scena Canvas.worldCamera copilului este înlocuită cu camera părintelui.

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

După ce SampleSceneChild salvați scriptul, atașați-l la . Canvas

Este OK dacă rezultatul executării și adăugării unei scene copil este așa cum se arată în figura de mai jos. Asigurați-vă că nu există nici bușteni.