Menambah adegan

Laman dikemaskini :
Tarikh penciptaan halaman :

Persekitaran pengesahan

Windows
  • Windows 11
Penyunting Perpaduan
  • 2020.3.25f1
Pakej Sistem Input
  • 1.2.0

Prasyarat untuk petua ini

Tetapan berikut telah dibuat terlebih dahulu sebagai premis untuk penerangan petua ini.

Tentang menambah adegan

Perpaduan membolehkan anda memaparkan berbilang adegan pada masa yang sama. Gunakannya apabila anda hanya mahu menindih adegan atau mengeksport lukisan anda ke tekstur yang berbeza.

Kali ini, saya ingin menerangkan paparan adegan yang ditindih dengan mengandaikan bahawa skrin menu dipaparkan di latar depan semasa permainan sedang berjalan.

Apabila memaparkan berbilang adegan, anda harus mengetahui perkara berikut:

  • Tidak boleh ada lebih daripada satu EventSystem
  • Tidak boleh ada lebih daripada satu Pendengar Audio
  • Berhati-hati semasa mengendalikan berbilang kamera

Sediakan tempat kejadian

Kali ini, kami akan menyediakan dua adegan. Biarkan , dan SampleSceneParentadegan SampleSceneChild yang akan dipaparkan tambahan ialah . Kaedah menyediakan dua adegan adalah sama seperti petua sebelumnya, jadi sila rujuk kepada mereka.

Kali ini, kami akan mencipta susun atur berikut. Jika anda mengklik butang dalam adegan induk, tiada masalah kecuali untuk menambah adegan kanak-kanak. dan sprites diletakkan untuk memudahkan anda Canvas memahami gejala-gejala yang akan anda lihat kemudian.

SampleSceneParent

SampleSceneChild

Apabila berbilang adegan dipaparkan, konteks objek bergantung pada "susunan lapisan" setiap objek, tanpa mengira unit adegan. Oleh kerana nilai awal adalah semua 0, biarkan SampleSceneChild Canvas no dan sprites ditetapkan kepada "1".

Jangan lupa untuk menetapkan kedua-dua adegan dalam tetapan binaan.

Adegan Pemprosesan

Ia diproses dalam kod dengan cara yang sama seperti menukar adegan. Kali ini juga, ia diproses apabila butang diklik, tetapi ia diproses sebagai tambahan dan bukannya suis adegan.

Nama fail skrip sewenang-wenangnya, tetapi di sini SceneAdd ia adalah .

Skrip kelihatan seperti ini:

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

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

Apabila menukar adegan, saya menetapkan kepada , LoadSceneMode Single tetapi kali Additive ini ia adalah . Itu sahaja yang ada perbezaannya.

Selepas SampleSceneParent anda menyimpan skrip, lampirkannya kepada . EventSystem

Tetapkan kaedah pada OnClick butang.

Cuba jalankan permainan untuk melihat bagaimana ia berfungsi. Jika anda mengklik butang, anda akan melihat pemandangan kanak-kanak.

Selain itu, jika anda melihat hierarki, anda dapat melihat bahawa terdapat dua adegan.

Walau bagaimanapun, walaupun adegan itu telah ditambah, nampaknya kandungan Kanvas adegan induk tidak dipaparkan. Sebaliknya, anda dapat melihat bahawa sprites dalam adegan induk dipaparkan di bahagian belakang mengikut susunan lapisan.

Juga, jika anda melihat konsol, anda dapat melihat bahawa log sentiasa dikeluarkan.

Kandungannya adalah dua perkara berikut.

  • Terdapat 2 sistem acara di tempat kejadian. Sila pastikan sentiasa ada satu sistem acara di tempat kejadian
  • Terdapat 2 pendengar audio di tempat kejadian. Sila pastikan sentiasa ada satu pendengar audio di tempat kejadian.

Apabila menggunakan pelbagai adegan, perlu sesuai dengan dua titik dan kamera ini.

Betulkan ralat EventSystem

Kandungan log adalah seperti berikut.

Terdapat 2 sistem acara di tempat kejadian. Sila pastikan sentiasa ada satu sistem acara di tempat kejadian

(Terdapat dua sistem peristiwa di tempat kejadian.) Pastikan anda sentiasa mempunyai satu sistem acara di tempat kejadian anda)

Seperti yang ditulis, menggabungkan EventSystem menjadi satu penyelesaian akan menyelesaikan masalah.

SampleSceneParent diandaikan sentiasa wujud,SampleSceneChild jadi padamkannya apabila EventSystem anda membukanya.

Sudah tentu, sila ambil perhatian bahawa jika anda berjalan dengan sendirinya,SampleSceneChild UI seperti butang tidak akan berfungsi.

Anda boleh melihat bahawa log EventSystem telah hilang apabila anda menjalankannya.

SampleSceneParent Juga, sejak adaEventSystem, butang dalam adegan kanak-kanak boleh diaktifkan.

Betulkan ralat AudioListeners

Kandungan log adalah seperti berikut.

Terdapat 2 pendengar audio di tempat kejadian. Sila pastikan sentiasa ada satu pendengar audio di tempat kejadian.

(Terdapat dua pendengar audio di tempat kejadian.) Pastikan hanya ada satu pendengar audio di tempat kejadian pada setiap masa. )

Main Camera Jika anda melihat komponen , anda pasti dapat melihat bahawa Pendengar Audio wujud, jadi SampleSceneChild anda boleh memadamkan Pendengar Audio dalam . Ia boleh diselesaikan dengan kawalan kamera item seterusnya, jadi kami akan menanganinya di sana.

Jika anda ingin menyimpan kamera,SampleSceneChild anda akan memadamkan Pendengar Audio ini.

Mengubah kamera untuk menunjukkan dua adegan

Bagi punca hanya kanvas adegan kanak-kanak dipaparkan semasa menambah adegan kanak-kanak, Ini kerana terdapat dua kamera, adegan induk dan adegan kanak-kanak yang ditetapkan pada kanvas, dan hanya satu kamera dipaparkan.

Penyelesaian untuk ini adalah untuk memaparkan kanvas kedua-dua adegan dengan kamera adegan induk. Prosesnya adalah untuk menggantikan kamera pada kanvas adegan kanak-kanak dengan kamera adegan ibu bapa selepas adegan kanak-kanak ditambah.

Mari buat skrip. Nama itu sewenang-wenangnya, tetapi dalam kes ChildSceneCamera ini ia adalah .

Skrip kelihatan seperti ini: Canvas Ia adalah proses prasyarat untuk dilampirkan kepada .

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 Kaedah ini dilaksanakan kali pertama objek wujud di tempat kejadian. Start Melaksanakan sebelum kaedah. Adalah baik untuk diingat bahawa anda sering menggunakannya. Kali ini, diandaikan bahawa ia akan dilaksanakan apabila adegan kanak-kanak ditambah.

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

Dapatkan kanvas adegan ibu bapa dan kanvas adegan kanak-kanak untuk menggantikan kamera. Terdapat pelbagai cara untuk melakukannya, tetapi ia bukan subjek utama, jadi anda boleh berfikir bahawa anda boleh mendapatkannya jika anda melakukannya dengan cara ini buat masa ini.

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

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

Musnahkan kamera Object.Destroy tempat kejadian kanak-kanak terlebih dahulu. Walaupun sudah tiada, tiada masalah kerana ia boleh ditutup oleh kamera adegan ibu bapa. Sasaran Canvas.worldCamera penghapusan diambil daripada . Ia hanya kerana kamera yang sama bahawa adegan pada ketika ini ditetapkan dan boleh diperoleh dengan mudah. Jika anda benar-benar mahu memadamkannya, lebih baik anda mendapatkan kamera dari tempat kejadian.

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

Akhirnya, adegan Canvas.worldCamera kanak-kanak digantikan dengan kamera ibu bapa.

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

Selepas SampleSceneChild anda menyimpan skrip, lampirkannya kepada . Canvas

Tidak mengapa jika hasil pelaksanaan dan menambah adegan kanak-kanak adalah seperti yang ditunjukkan dalam gambar di bawah. Pastikan tiada balak sama ada.