Adăugarea unei scene
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 SampleSceneParent
scena 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.