Dodajanje prizora

Stran posodobljena :
Datum ustvarjanja strani :

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