Scenos įtraukimas

Puslapis atnaujintas :
Puslapio sukūrimo data :

Tikrinimo aplinka

Windows
  • Langai 11
"Unity" redaktorius
  • 2020.3.25f1
Įvesties sistemos paketas
  • 1.2.0

Būtinos šio patarimo sąlygos

Šie nustatymai buvo atlikti iš anksto kaip šio patarimo aprašymo prielaida.

Apie scenos įtraukimą

"Unity" leidžia vienu metu rodyti kelias scenas. Naudokite jį, kai tiesiog norite perdengti scenas arba eksportuoti piešinius į kitą tekstūrą.

Šį kartą norėčiau paaiškinti viršutinį scenos ekraną, darant prielaidą, kad meniu ekranas rodomas pirmame plane, kai žaidimas veikia, kol žaidimas veikia.

Kai rodomos kelios scenos, turėtumėte žinoti šiuos dalykus:

  • Turi būti ne daugiau kaip viena EventSystem
  • Turi būti ne daugiau kaip vienas garso klausytojas
  • Būkite atsargūs tvarkydami kelias kameras

Paruoškite sceną

Šį kartą paruošime dvi scenas. Tebūnie , o SampleSceneParentscena SampleSceneChild , kurią reikia rodyti papildomai, yra . Dviejų scenų paruošimo būdas yra toks pat, kaip ir ankstesniuose patarimuose, todėl žiūrėkite juos.

Šį kartą sukursime tokį išdėstymą. Jei spustelėsite mygtuką pirminėje scenoje, nebus jokių problemų, išskyrus tai, kad pridėsite antrinę sceną. ir spritai dedami tam, kad būtų lengviau Canvas suprasti simptomus, kuriuos pamatysite vėliau.

SampleSceneParent

SampleSceneChild

Kai rodomos kelios scenos, objektų kontekstas priklauso nuo kiekvieno objekto "sluoksnių tvarkos", nepriklausomai nuo scenos vieneto. Kadangi pradinės vertės yra visos 0, palikite SampleSceneChild Canvas "ne" ir "sprites" į "1".

Nepamirškite nustatyti dviejų scenų kūrimo nustatymuose.

Scenų apdorojimas

Jis apdorojamas kodu taip pat, kaip ir scenų perjungimas. Šį kartą jis taip pat apdorojamas spustelėjus mygtuką, tačiau jis apdorojamas kaip priedas, o ne scenos jungiklis.

Scenarijaus failo pavadinimas yra savavališkas, bet čia SceneAdd jis yra .

Scenarijus atrodo taip:

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

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

Keisdamas scenas, nusistačiau , LoadSceneMode Single bet šį kartą Additive tai yra . Tai viskas, kas yra skirtumas.

Įrašę SampleSceneParent scenarijų, pridėkite jį prie . EventSystem

Nustatykite metodą ant OnClick mygtuko.

Pabandykite paleisti žaidimą, kad pamatytumėte, kaip jis veikia. Jei spustelėsite mygtuką, pamatysite vaiko sceną.

Be to, jei pažvelgsite į hierarchiją, pamatysite, kad yra dvi scenos.

Tačiau, nepaisant to, kad scena buvo pridėta, atrodo, kad pagrindinės scenos drobės turinys nerodomas. Ir atvirkščiai, matote, kad spritai pagrindinėje scenoje rodomi galinėje pusėje pagal sluoksnių tvarką.

Be to, jei pažvelgsite į konsolę, pamatysite, kad žurnalai nuolat išvedami.

Turinys yra šie du punktai.

  • Scenoje yra 2 renginių sistemos. Įsitikinkite, kad scenoje visada yra tiksliai viena renginio sistema
  • Scenoje yra 2 garso klausytojai. Įsitikinkite, kad scenoje visada yra tiksliai vienas garso klausytojas.

Naudojant kelias scenas, būtina atitikti šiuos du taškus ir kamerą.

Ištaisykite "EventSystem" klaidas

Žurnalo turinys yra toks.

Scenoje yra 2 renginių sistemos. Įsitikinkite, kad scenoje visada yra tiksliai viena renginio sistema

(Scenoje yra dvi įvykių sistemos.) Įsitikinkite, kad savo scenoje visada turite vieną įvykių sistemą)

Kaip rašyta, sujungus EventSystem į vieną sprendimą, problema bus išspręsta.

SampleSceneParent manoma, kad jis visada egzistuoja,SampleSceneChild todėl atidarykite jį EventSystem .

Žinoma, atminkite, kad jei paleisite patys, vartotojo sąsaja, pvz., Mygtukai,SampleSceneChild neveiks.

Matote, kad EventSystem žurnalai dingo, kai jį paleidžiate.

SampleSceneParent Be to, kadangi yraEventSystem, vaiko scenoje esančius mygtukus galima suaktyvinti.

"AudioListeners" klaidų taisymas

Žurnalo turinys yra toks.

Scenoje yra 2 garso klausytojai. Įsitikinkite, kad scenoje visada yra tiksliai vienas garso klausytojas.

(Scenoje yra du garso klausytojai.) Įsitikinkite, kad scenoje visada yra tik vienas garso klausytojas. )

Main Camera Jei pažvelgsite į komponentus , tikrai pamatysite, kad garso klausytojas egzistuoja, todėl SampleSceneChild galite ištrinti garso klausytoją . Tai galima išspręsti fotoaparatu valdant kitą elementą, todėl mes jį spręsime ten.

Jei norite pasilikti fotoaparatą,SampleSceneChild ištrinsite šį garso klausytoją.

Pakeiskite kamerą, kad būtų rodomos dvi scenos

Kalbant apie priežastį, kad pridedant vaiko sceną rodoma tik vaiko scenos drobė, Taip yra todėl, kad yra dvi kameros, pagrindinė scena ir vaiko scena, nustatyta ant drobės, ir rodoma tik viena kamera.

Sprendimas yra parodyti abiejų scenų drobę su pagrindinės scenos kamera. Procesas yra pakeisti fotoaparatą vaiko scenos drobėje į pirminės scenos kamerą, kai pridedama vaiko scena.

Sukurkime scenarijų. Pavadinimas yra savavališkas, tačiau šiuo atveju ChildSceneCamera jis yra .

Scenarijus atrodo taip: Canvas Tai yra būtinas procesas, kurį reikia prijungti prie .

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 Metodas vykdomas pirmą kartą, kai objektas egzistuoja scenoje. Start Vykdo prieš metodą. Pravartu prisiminti, kad dažnai jį naudojate. Šį kartą daroma prielaida, kad jis bus įvykdytas, kai bus pridėta vaiko scena.

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

Gaukite pirminės scenos drobę ir antrinės scenos drobę, kad pakeistumėte fotoaparatą. Yra įvairių būdų, kaip tai padaryti, tačiau tai nėra pagrindinė tema, todėl galite galvoti, kad galite tai gauti, jei tai padarysite tokiu būdu.

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

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

Pirmiausia sunaikinkite vaiko scenos kamerą Object.Destroy . Net jei jo nebėra, nėra jokių problemų, nes jį gali uždengti tėvų scenos kamera. Naikinimo tikslas Canvas.worldCamera gaunamas iš . Taip yra tik todėl, kad ta pati kamera, kurią šiuo metu turi scena, yra nustatyta ir ją galima lengvai įsigyti. Jei iš tikrųjų norite jį ištrinti, geriau pasiimkite fotoaparatą iš scenos.

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

Galiausiai vaiko scena Canvas.worldCamera pakeičiama tėvų kamera.

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

Įrašę SampleSceneChild scenarijų, pridėkite jį prie . Canvas

Gerai, jei vaiko scenos vykdymo ir pridėjimo rezultatas yra toks, kaip parodyta paveikslėlyje žemiau. Įsitikinkite, kad nėra ir žurnalų.