Menambah adegan
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 SampleSceneParent
adegan 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.