Menambahkan adegan

Halaman Diperbarui :
Tanggal pembuatan halaman :

Lingkungan verifikasi

Windows
  • jendela 11
Editor Kesatuan
  • 25f1/3/2020
Paket Sistem Input
  • 1.2.0

Prasyarat untuk tip ini

Pengaturan berikut telah dibuat sebelumnya sebagai premis untuk deskripsi tip ini.

Tentang menambahkan adegan

Unity memungkinkan Anda untuk menampilkan beberapa adegan secara bersamaan. Gunakan saat Anda hanya ingin melapisi adegan atau mengekspor gambar Anda ke tekstur yang berbeda.

Kali ini, saya ingin menjelaskan tampilan pemandangan yang ditumpangkan dengan asumsi bahwa layar menu ditampilkan di latar depan saat game sedang berjalan saat game sedang berjalan.

Apabila menampilkan beberapa pemandangan, Anda harus menyadari hal-hal berikut:

  • Tidak boleh ada lebih dari satu EventSystem
  • Tidak boleh ada lebih dari satu Pendengar Audio
  • Hati-hati saat menangani beberapa kamera

Siapkan adegan

Kali ini, kami akan menyiapkan dua adegan. Biarlah , dan SampleSceneParentadegan SampleSceneChild yang akan ditampilkan juga adalah . Metode menyiapkan dua adegan sama dengan tips sebelumnya, jadi silakan merujuknya.

Kali ini, kita akan membuat layout berikut. Jika Anda mengklik tombol di adegan induk, tidak ada masalah kecuali menambahkan adegan anak. Dan sprite ditempatkan untuk memudahkan memahami Canvas gejala yang akan Anda lihat nanti.

SampleSceneParent

SampleSceneChild

Ketika beberapa adegan ditampilkan, konteks objek tergantung pada "urutan lapisan" dari setiap objek, terlepas dari unit adegan. Karena nilai awal semuanya 0, biarkan SampleSceneChild Canvas no dan sprite diatur ke "1".

Jangan lupa untuk mengatur dua adegan dalam pengaturan build.

Memproses Adegan

Ini diproses dalam kode dengan cara yang sama seperti beralih adegan. Kali ini juga, diproses ketika tombol diklik, tetapi diproses sebagai tambahan, bukan sakelar adegan.

Nama file skrip sewenang-wenang, tetapi ini SceneAdd dia .

Skripnya terlihat seperti ini:

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

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

Saat beralih adegan, saya mengatur ke , LoadSceneMode Single tetapi kali Additive ini . Hanya itu yang ada bedanya.

Setelah SampleSceneParent Anda menyimpan skrip, lampirkan ke . EventSystem

Atur metode pada OnClick tombol.

Coba jalankan game untuk melihat cara kerjanya. Jika Anda mengklik tombol, Anda akan melihat adegan anak.

Juga, jika Anda melihat hierarki, Anda dapat melihat bahwa ada dua adegan.

Namun, terlepas dari kenyataan bahwa adegan telah ditambahkan, tampaknya isi Canvas adegan induk tidak ditampilkan. Sebaliknya, Anda dapat melihat bahwa sprite dalam adegan induk ditampilkan di sisi belakang sesuai dengan urutan lapisan.

Juga, jika Anda melihat konsol, Anda dapat melihat bahwa log terus-menerus keluar.

Isinya adalah dua poin berikut.

  • Ada 2 sistem acara di tempat kejadian. Harap pastikan selalu ada satu sistem acara di tempat kejadian
  • Ada 2 pendengar audio di tempat kejadian. Pastikan selalu ada tepat satu pendengar audio di tempat kejadian.

Saat menggunakan beberapa adegan, perlu untuk menyesuaikan dengan dua titik ini dan kamera.

Memperbaiki error EventSystem

Isi log adalah sebagai berikut.

Ada 2 sistem acara di tempat kejadian. Harap pastikan selalu ada satu sistem acara di tempat kejadian

(Ada dua sistem peristiwa di tempat kejadian.) Pastikan Anda selalu memiliki satu sistem acara dalam adegan Anda)

Seperti yang tertulis, menggabungkan EventSystem menjadi satu solusi akan menyelesaikan masalah.

SampleSceneParent diasumsikan selalu ada,SampleSceneChild jadi hapus saat EventSystem Anda membukanya.

Tentu saja, harap dicatat bahwa jika Anda menjalankan dengan sendirinya,SampleSceneChild UI seperti tombol tidak akan berfungsi.

Anda dapat melihat bahwa log EventSystem telah hilang ketika Anda menjalankannya.

SampleSceneParent Juga, karena adaEventSystem, tombol-tombol dalam adegan anak dapat diaktifkan.

Memperbaiki error AudioListeners

Isi log adalah sebagai berikut.

Ada 2 pendengar audio di tempat kejadian. Pastikan selalu ada tepat satu pendengar audio di tempat kejadian.

(Ada dua pendengar audio di tempat kejadian.) Pastikan hanya ada satu pendengar audio di tempat kejadian setiap saat. )

Main Camera Jika Anda melihat komponen , Anda pasti dapat melihat bahwa Audio Listener ada, sehingga SampleSceneChild Anda dapat menghapus Audio Listener di . Ini dapat diselesaikan dengan kontrol kamera dari item berikutnya, jadi kami akan menanganinya di sana.

Jika Anda ingin menyimpan kamera,SampleSceneChild Anda akan menghapus Pendengar Audio ini.

Ubah kamera untuk menampilkan dua adegan

Adapun penyebab bahwa hanya kanvas adegan anak yang ditampilkan saat menambahkan adegan anak, Ini karena ada dua kamera, adegan induk dan adegan anak diatur di kanvas, dan hanya satu kamera yang ditampilkan.

Solusi untuk ini adalah menampilkan kanvas kedua adegan dengan kamera adegan induk. Prosesnya adalah mengganti kamera pada kanvas adegan anak dengan kamera adegan induk setelah adegan anak ditambahkan.

Mari kita buat skrip. Namanya sewenang-wenang, tetapi dalam kasus ChildSceneCamera ini adalah .

Skripnya terlihat seperti ini: Canvas Ini adalah proses prasyarat untuk dilampirkan ke .

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 Metode ini dijalankan saat pertama kali objek ada di tempat kejadian. Start Mengeksekusi sebelum metode. Ada baiknya untuk diingat bahwa Anda sering menggunakannya. Kali ini, diasumsikan akan dieksekusi ketika adegan anak ditambahkan.

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

Dapatkan kanvas adegan induk dan kanvas adegan anak untuk mengganti kamera. Ada berbagai cara untuk melakukannya, tetapi itu bukan subjek utama, sehingga Anda dapat berpikir bahwa Anda bisa mendapatkannya jika Anda melakukannya dengan cara ini untuk saat ini.

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

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

Hancurkan kamera Object.Destroy adegan anak terlebih dahulu. Kalaupun hilang, tidak ada masalah karena bisa ditutupi oleh kamera adegan orang tua. Target Canvas.worldCamera penghapusan diambil dari . Itu hanya karena kamera yang sama dengan pemandangan pada saat ini diatur dan dapat dengan mudah diperoleh. Jika Anda benar-benar ingin menghapusnya, Anda sebaiknya mengambil kamera dari tempat kejadian.

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

Akhirnya, adegan Canvas.worldCamera anak diganti dengan kamera orang tua.

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

Setelah SampleSceneChild Anda menyimpan skrip, lampirkan ke . Canvas

Tidak apa-apa jika hasil mengeksekusi dan menambahkan adegan anak adalah seperti yang ditunjukkan pada gambar di bawah ini. Pastikan tidak ada log juga.