Dodajanje prizora
Okolje za preverjanje
- Windows
-
- Windows 11
- Urejevalnik Unity
-
- 2020.3.25F1
- Paket vhodnega sistema
-
- 1.2.0
Predpogoji za ta nasvet
Naslednje nastavitve so bile vnaprej narejene kot premisa za opis tega nasveta.
O dodajanju prizora
Unity vam omogoča prikaz več prizorov hkrati. Uporabite ga, ko želite preprosto prekrivati prizore ali risbe izvoziti v drugo teksturo.
Tokrat bi rad razložil prekrivajoči se prikaz prizora ob predpostavki, da je zaslon menija prikazan v ospredju, medtem ko igra teče, medtem ko igra teče.
Pri prikazovanju več prizorov upoštevajte naslednje:
- Ne sme biti več kot en sistem dogodkov
- Zvočni poslušalec ne sme biti več kot en
- Bodite previdni pri ravnanju z več kamerami
Priprava prizora
Tokrat bomo pripravili dva prizora. Naj bo , in SampleSceneParent
prizor SampleSceneChild
, ki bo dodatno prikazan, je .
Način priprave dveh prizorov je enak kot prejšnji nasveti, zato si jih oglejte.
Tokrat bomo ustvarili naslednjo postavitev. Če kliknete gumb v nadrejenem prizoru, ni nobenega problema, razen dodajanja podrejenega prizora.
In sprites so postavljeni, da lažje Canvas
razumejo simptome, ki jih boste videli kasneje.
SampleSceneParent
SampleSceneChild
Ko je prikazanih več prizorov, je kontekst predmetov odvisen od "vrstnega reda plasti" vsakega predmeta, ne glede na enoto prizora.
Ker so začetne vrednosti vse 0, pustite SampleSceneChild
Canvas
ne in sprites nastavljeno na "1".
Ne pozabite nastaviti dveh prizorov v nastavitvah gradnje.
Obdelava prizorov
Obdeluje se v kodi na enak način kot preklapljanje prizorov. Tudi tokrat se obdela, ko kliknete gumb, vendar se obdela kot dodatek in ne kot stikalo prizora.
Ime skriptne datoteke je poljubno, toda tukaj SceneAdd
je .
Scenarij izgleda takole:
using UnityEngine;
using UnityEngine.SceneManagement; // 追加
public class SceneAdd : MonoBehaviour
{
<summary>ボタンをクリックしたときに呼ばれます。</summary>
public void OnClick()
{
// 指定したシーンを追加します
SceneManager.LoadScene("SampleSceneChild", LoadSceneMode.Additive);
}
}
Pri preklapljanju prizorov LoadSceneMode
sem nastavil na , Single
tokrat Additive
pa je.
To je vse, kar je razlika.
Ko SampleSceneParent
shranite skript, ga priložite . EventSystem
Nastavite metodo na gumbu OnClick
.
Poskusite zagnati igro in si oglejte, kako deluje. Če kliknete gumb, boste videli podrejeni prizor.
Če pogledate hierarhijo, lahko vidite, da obstajata dva prizora.
Kljub temu, da je bil prizor dodan, se zdi, da vsebina platna starševskega prizora ni prikazana. Nasprotno pa lahko vidite, da so sprite v nadrejenem prizoru prikazane na hrbtni strani glede na vrstni red plasti.
Tudi, če pogledate konzolo, lahko vidite, da so dnevniki nenehno izhodni.
Vsebina je naslednji dve točki.
- Na prizorišču sta 2 sistema dogodkov. Prosimo, prepričajte se, da je na prizorišču vedno točno en sistem dogodkov
- Na prizorišču sta 2 poslušalca zvoka. Prepričajte se, da je na prizorišču vedno točno en zvočni poslušalec.
Pri uporabi več prizorov je potrebno ustrezati tema dvema točkama in kameri.
Odpravljanje napak sistema dogodkov
Vsebina dnevnika je naslednja.
Na prizorišču sta 2 sistema dogodkov. Prosimo, prepričajte se, da je na prizorišču vedno točno en sistem dogodkov
(Na prizorišču sta dva sistema dogodkov.) Poskrbite, da boste vedno imeli en sistem dogodkov na svojem prizorišču)
Kot je zapisano, bo združitev EventSystem v eno rešitev rešila problem.
SampleSceneParent
Predpostavlja se, da vedno obstaja, zato ga izbrišite,SampleSceneChild
ko EventSystem
ga odprete.
Seveda upoštevajte, da če zaženete sami, uporabniški vmesnik, kot so gumbi,SampleSceneChild
ne bo deloval.
Vidite lahko, da so dnevniki sistema dogodkov izginili, ko ste ga zagnali.
SampleSceneParent
Ker je EventSystem
prisoten, se lahko aktivirajo gumbi na otroškem prizorišču.
Odpravljanje napak AudioListeners
Vsebina dnevnika je naslednja.
Na prizorišču sta 2 poslušalca zvoka. Prepričajte se, da je na prizorišču vedno točno en zvočni poslušalec.
(Na prizorišču sta dva poslušalca zvoka.) Prepričajte se, da je na prizorišču ves čas samo en zvočni poslušalec. )
Main Camera
Če pogledate komponente , lahko zagotovo vidite, da zvočni poslušalec obstaja, tako da SampleSceneChild
lahko izbrišete zvočni poslušalec v .
To je mogoče rešiti z nadzorom kamere naslednjega elementa, zato ga bomo tam obravnavali.
Če želite obdržati kamero,SampleSceneChild
boste ta zvočni poslušalec izbrisali.
Spreminjanje kamere za prikaz dveh prizorov
Kar se tiče vzroka, da se pri dodajanju otroškega prizora prikaže samo platno otroškega prizora, To je zato, ker sta na platnu postavljeni dve kameri, nadrejeni prizor in otroški prizor, prikazana pa je samo ena kamera.
Rešitev za to je prikaz platna obeh prizorov s kamero starševskega prizora. Postopek je zamenjava kamere na platnu otroškega prizora s kamero nadrejenega prizora, potem ko je otroški prizor dodan.
Ustvarimo skript. Ime je poljubno, vendar je v tem primeru ChildSceneCamera
.
Scenarij izgleda takole: Canvas
To je predpogoj za pritrditev na .
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 se izvede, ko predmet prvič obstaja v prizoru. Start
Izvede se pred metodo.
Dobro si je zapomniti, da ga pogosto uporabljate.
Tokrat se predpostavlja, da bo izveden, ko bo dodan otroški prizor.
<summary>シーンに追加されたタイミングで処理されます。</summary>
void Awake()
{
// 処理
}
Pridobite nadrejeno platno prizora in platno otroškega prizora, da zamenjata kamero. Obstajajo različni načini za to, vendar to ni glavna tema, zato lahko mislite, da jo lahko dobite, če to za zdaj storite na ta način.
// 親のシーンのキャンバスを取得
var parentScene = SceneManager.GetSceneByName("SampleSceneParent");
var parentCanvas = parentScene.GetRootGameObjects().First(obj => obj.GetComponent<Canvas>() != null).GetComponent<Canvas>();
// 子のシーンのキャンバスを取得
var childCanvas = GetComponent<Canvas>();
Najprej uničite kamero Object.Destroy
otroškega prizora. Tudi če ga ni več, ni problema, ker ga lahko pokrije kamera prizora staršev.
Cilj brisanja Canvas.worldCamera
je pridobljen iz .
Samo zato, ker je isti fotoaparat, ki ga ima prizor na tej točki, nastavljen in ga je mogoče enostavno pridobiti.
Če ga dejansko želite izbrisati, raje vzemite fotoaparat s prizorišča.
// 子のシーンのカメラを削除
Object.Destroy(childCanvas.worldCamera.gameObject);
Končno se otroški prizor Canvas.worldCamera
nadomesti s kamero staršev.
// 子のシーンのキャンバスのカメラを親のシーンのカメラに置き換えます
childCanvas.worldCamera = parentCanvas.worldCamera;
Ko SampleSceneChild
shranite skript, ga priložite . Canvas
V redu je, če je rezultat izvedbe in dodajanja otroškega prizora takšen, kot je prikazano na spodnji sliki. Prepričajte se, da tudi dnevnikov ni.