Tilanteen lisääminen

Sivu päivitetty :
Sivun luontipäivämäärä :

Varmennusympäristö

Windows
  • Windows 11
Unity-editori
  • 2020.3.25F1
Syöttöjärjestelmän paketti
  • 1.2.0

Tämän vinkin edellytykset

Seuraavat asetukset on tehty etukäteen tämän vinkin kuvauksen lähtökohtana.

Tietoja kohtauksen lisäämisestä

Unity-toiminnon avulla voit näyttää useita kohtauksia samanaikaisesti. Käytä sitä, kun haluat vain peittää kohtauksia tai viedä piirustuksesi toiseen tekstuuriin.

Tällä kertaa haluaisin selittää kohtauksen päällekkäisen näytön olettaen, että valikkonäyttö näkyy etualalla, kun peli on käynnissä pelin ollessa käynnissä.

Kun näytät useita kohtauksia, ota huomioon seuraavat asiat:

  • Tapahtumajärjestelmiä saa olla vain yksi
  • Äänenkuuntelijoita saa olla vain yksi
  • Ole varovainen, kun käsittelet useita kameroita

Valmistele kohtaus

Tällä kertaa valmistelemme kaksi kohtausta. Olkoon , ja SampleSceneParentlisäksi näytettävä näkymä SampleSceneChild on . Kahden kohtauksen valmistelumenetelmä on sama kuin edelliset vinkit, joten tutustu niihin.

Tällä kertaa luomme seuraavan asettelun. Jos napsautat päänäkymän painiketta, ei ole muuta ongelmaa kuin lisätä lapsikohtaus. Ja sprites on sijoitettu, jotta on helpompi Canvas ymmärtää oireita, joita näet myöhemmin.

Näytekohtausvanhempi

Näytekohtauslapsi

Kun näytetään useita kohtauksia, objektien konteksti riippuu kunkin objektin "tasojärjestyksestä" näkymäyksiköstä riippumatta. Koska kaikki alkuarvot ovat 0, jätä SampleSceneChild Canvas ei- ja sprites-arvoksi "1".

Älä unohda asettaa kahta kohtausta rakennusasetuksissa.

Kohtausten käsittely

Se käsitellään koodissa samalla tavalla kuin kohtausten vaihtaminen. Tälläkin kertaa se käsitellään, kun painiketta napsautetaan, mutta se käsitellään lisäyksenä kohtauskytkimen sijaan.

Skriptitiedoston nimi on mielivaltainen, mutta tässä SceneAdd se on .

Skripti näyttää tältä:

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

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

Kun vaihdan kohtausta, asetin arvoksi , LoadSceneMode Single mutta tällä kertaa Additive se on . Siinä kaikki, mitä erossa on.

Kun SampleSceneParent olet tallentanut komentosarjan, liitä se . EventSystem

Aseta menetelmä painikkeeseen OnClick .

Kokeile suorittaa peli nähdäksesi, miten se toimii. Jos napsautat painiketta, näet lapsikohtauksen.

Lisäksi, jos katsot hierarkiaa, näet, että kohtauksia on kaksi.

Huolimatta siitä, että kohtaus on lisätty, näyttää siltä, että pääkohtauksen kankaan sisältöä ei näytetä. Sitä vastoin voit nähdä, että pääkohtauksen sprites näytetään takapuolella tasojen järjestyksen mukaan.

Lisäksi, jos katsot konsolia, näet, että lokit tulostetaan jatkuvasti.

Sisältö on seuraavat kaksi kohtaa.

  • Kohtauksessa on 2 tapahtumajärjestelmää. Varmista, että tapahtumapaikalla on aina tasan yksi tapahtumajärjestelmä
  • Kohtauksessa on 2 äänen kuuntelijaa. Varmista, että kohtauksessa on aina tasan yksi äänen kuuntelija.

Kun käytät useita kohtauksia, on tarpeen vastata näitä kahta pistettä ja kameraa.

EventSystem-virheiden korjaaminen

Lokin sisältö on seuraava.

Kohtauksessa on 2 tapahtumajärjestelmää. Varmista, että tapahtumapaikalla on aina tasan yksi tapahtumajärjestelmä

(Kohtauksessa on kaksi tapahtumajärjestelmää.) Varmista, että kohtauksessasi on aina yksi tapahtumajärjestelmä)

Kuten kirjoitettu, EventSystemin yhdistäminen yhdeksi ratkaisuksi ratkaisee ongelman.

SampleSceneParent oletetaan olevan aina olemassa, joten poista se,SampleSceneChild kun EventSystem avaat sen.

Huomaa tietysti, että jos suoritat itse, käyttöliittymä, kuten painikkeet,SampleSceneChild eivät toimi.

Voit nähdä, että EventSystem-lokit ovat kadonneet, kun suoritat sen.

SampleSceneParent Lisäksi, koska se on EventSystem läsnä, lapsikohtauksen painikkeet voidaan aktivoida.

Korjaa AudioListeners-virheet

Lokin sisältö on seuraava.

Kohtauksessa on 2 äänen kuuntelijaa. Varmista, että kohtauksessa on aina tasan yksi äänen kuuntelija.

(Kohtauksessa on kaksi äänen kuuntelijaa.) Varmista, että kohtauksessa on aina vain yksi äänen kuuntelija. )

Main Camera Jos tarkastelet , voit varmasti nähdä, että Audio Listener on olemassa, joten SampleSceneChild voit poistaa Audio Listenerin . Se voidaan ratkaista seuraavan kohteen kameraohjauksella, joten käsittelemme sitä siellä.

Jos haluat säilyttää kameran,SampleSceneChild poistat tämän äänen kuuntelijan.

Kameran muuttaminen näyttämään kaksi näkymää

Mitä tulee siihen, että vain lapsikohtauksen kangas näytetään, kun lisäät lapsikohtauksen, Tämä johtuu siitä, että kankaalle on asetettu kaksi kameraa, päänäkymä ja lapsinäkymä, ja vain yksi kamera näytetään.

Ratkaisu tähän on näyttää molempien kohtausten kangas vanhemman kohtauksen kameralla. Prosessi on korvata lapsinäkymän kankaalla oleva kamera päänäkymän kameralla, kun lapsinäkymä on lisätty.

Luodaan komentosarja. Nimi on mielivaltainen, mutta tässä tapauksessa ChildSceneCamera se on .

Skripti näyttää tältä: Canvas Se on ennakkoehtoinen prosessi, joka liitetään .

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 Menetelmä suoritetaan, kun objekti esiintyy kohtauksessa ensimmäisen kerran. Start Suorittaa ennen menetelmää. On hyvä muistaa, että käytät sitä usein usein. Tällä kertaa oletetaan, että se suoritetaan, kun lapsikohtaus lisätään.

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

Hanki päänäkymän piirtoalue ja lapsinäkymän piirtoalue korvaamaan kamera. On olemassa useita tapoja tehdä se, mutta se ei ole pääaihe, joten voit ajatella, että voit saada sen, jos teet sen tällä tavalla toistaiseksi.

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

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

Tuhoa ensin lapsinäkymän kamera Object.Destroy . Vaikka se olisi poissa, ei ole mitään ongelmaa, koska vanhemman kohtauksen kamera voi peittää sen. Poistokohde Canvas.worldCamera noudetaan kohteesta . Se johtuu vain siitä, että sama kamera, joka kohtauksessa on tässä vaiheessa, on asetettu ja se voidaan helposti hankkia. Jos haluat todella poistaa sen, sinun on parasta hankkia kamera paikalta.

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

Lopuksi lapsikohtaus Canvas.worldCamera korvataan vanhemman kameralla.

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

Kun SampleSceneChild olet tallentanut komentosarjan, liitä se . Canvas

On OK, jos lapsikohtauksen suorittamisen ja lisäämisen tulos on alla olevan kuvan mukainen. Varmista, ettei myöskään ole lokeja.