Προσθήκη σκηνής
Περιβάλλον επαλήθευσης
- παράθυρα
-
- Παράθυρα 11
- Επεξεργαστής ενότητας
-
- 2020.3.25στ1
- Πακέτο συστήματος εισόδου
-
- 1.2.0
Προϋποθέσεις για αυτήν τη συμβουλή
Οι ακόλουθες ρυθμίσεις έχουν γίνει εκ των προτέρων ως προϋπόθεση για την περιγραφή αυτής της συμβουλής.
Πληροφορίες για την προσθήκη σκηνής
Το Unity σάς επιτρέπει να προβάλλετε πολλές σκηνές ταυτόχρονα. Χρησιμοποιήστε το όταν θέλετε απλώς να επικαλύψετε σκηνές ή να εξαγάγετε τα σχέδιά σας σε διαφορετική υφή.
Αυτή τη φορά, θα ήθελα να εξηγήσω την υπερτιθέμενη εμφάνιση της σκηνής υποθέτοντας ότι η οθόνη μενού εμφανίζεται στο προσκήνιο ενώ το παιχνίδι εκτελείται ενώ το παιχνίδι εκτελείται.
Κατά την εμφάνιση πολλών σκηνών, θα πρέπει να γνωρίζετε τα εξής:
- Δεν πρέπει να υπάρχουν περισσότερα από ένα EventSystem
- Δεν πρέπει να υπάρχουν περισσότεροι από ένας ακροατές ήχου
- Να είστε προσεκτικοί όταν χειρίζεστε πολλές κάμερες
Προετοιμάστε τη σκηνή
Αυτή τη φορά, θα ετοιμάσουμε δύο σκηνές. Ας είναι , και SampleSceneParent
η σκηνή SampleSceneChild
που θα εμφανιστεί επιπλέον είναι .
Η μέθοδος προετοιμασίας δύο σκηνών είναι η ίδια με τις προηγούμενες συμβουλές, οπότε ανατρέξτε σε αυτές.
Αυτή τη φορά, θα δημιουργήσουμε την ακόλουθη διάταξη. Εάν κάνετε κλικ στο κουμπί στη γονική σκηνή, δεν υπάρχει πρόβλημα εκτός από την προσθήκη της θυγατρικής σκηνής.
Και τα αντικείμενα τοποθετούνται για να διευκολύνουν την Canvas
κατανόηση των συμπτωμάτων που θα δείτε αργότερα.
SampleSceneParent
ΔείγμαSceneChild
Όταν εμφανίζονται πολλές σκηνές, το περιβάλλον των αντικειμένων εξαρτάται από τη "σειρά επιπέδων" κάθε αντικειμένου, ανεξάρτητα από τη μονάδα σκηνής.
Δεδομένου ότι οι αρχικές τιμές είναι όλες 0, αφήστε SampleSceneChild
Canvas
το όχι και τα αντικείμενα ρυθμισμένα σε "1".
Μην ξεχάσετε να ορίσετε τις δύο σκηνές στις ρυθμίσεις κατασκευής.
Επεξεργασία σκηνών
Επεξεργάζεται σε κώδικα με τον ίδιο τρόπο όπως η εναλλαγή σκηνών. Και αυτή τη φορά, υποβάλλεται σε επεξεργασία όταν κάνετε κλικ στο κουμπί, αλλά υποβάλλεται σε επεξεργασία ως προσθήκη αντί για διακόπτη σκηνής.
Το όνομα του αρχείου σεναρίου είναι αυθαίρετο, αλλά εδώ SceneAdd
είναι .
Το σενάριο μοιάζει με αυτό:
using UnityEngine;
using UnityEngine.SceneManagement; // 追加
public class SceneAdd : MonoBehaviour
{
<summary>ボタンをクリックしたときに呼ばれます。</summary>
public void OnClick()
{
// 指定したシーンを追加します
SceneManager.LoadScene("SampleSceneChild", LoadSceneMode.Additive);
}
}
Κατά την εναλλαγή σκηνών, έβαλα σε , LoadSceneMode
Single
αλλά αυτή τη φορά Additive
είναι .
Αυτό είναι το μόνο που υπάρχει στη διαφορά.
Αφού SampleSceneParent
αποθηκεύσετε τη δέσμη ενεργειών, επισυνάψτε την στο . EventSystem
Ορίστε τη μέθοδο στο OnClick
κουμπί.
Δοκιμάστε να εκτελέσετε το παιχνίδι για να δείτε πώς λειτουργεί. Εάν κάνετε κλικ στο κουμπί, θα δείτε την παιδική σκηνή.
Επίσης, αν κοιτάξετε την ιεραρχία, μπορείτε να δείτε ότι υπάρχουν δύο σκηνές.
Ωστόσο, παρά το γεγονός ότι η σκηνή έχει προστεθεί, φαίνεται ότι τα περιεχόμενα του καμβά της γονικής σκηνής δεν εμφανίζονται. Αντίθετα, μπορείς να δεις ότι τα αντικείμενα στη γονική σκηνή εμφανίζονται στην πίσω πλευρά σύμφωνα με τη σειρά των επιπέδων.
Επίσης, αν κοιτάξετε την κονσόλα, μπορείτε να δείτε ότι τα αρχεία καταγραφής εξάγονται συνεχώς.
Το περιεχόμενο είναι τα ακόλουθα δύο σημεία.
- Υπάρχουν 2 συστήματα εκδηλώσεων στη σκηνή. Βεβαιωθείτε ότι υπάρχει πάντα ακριβώς ένα σύστημα εκδηλώσεων στη σκηνή
- Υπάρχουν 2 ακροατές ήχου στη σκηνή. Βεβαιωθείτε ότι υπάρχει πάντα ακριβώς ένας ακροατής ήχου στη σκηνή.
Όταν χρησιμοποιείτε πολλές σκηνές, είναι απαραίτητο να αντιστοιχείτε σε αυτά τα δύο σημεία και στην κάμερα.
Διόρθωση σφαλμάτων EventSystem
Τα περιεχόμενα του αρχείου καταγραφής έχουν ως εξής.
Υπάρχουν 2 συστήματα εκδηλώσεων στη σκηνή. Βεβαιωθείτε ότι υπάρχει πάντα ακριβώς ένα σύστημα εκδηλώσεων στη σκηνή
(Υπάρχουν δύο συστήματα συμβάντων στη σκηνή.) Βεβαιωθείτε ότι έχετε πάντα ένα σύστημα εκδηλώσεων στη σκηνή σας)
Όπως γράφτηκε, ο συνδυασμός του EventSystem σε μία λύση θα λύσει το πρόβλημα.
SampleSceneParent
θεωρείται ότι υπάρχει πάντα,SampleSceneChild
επομένως διαγράψτε το όταν EventSystem
το ανοίξετε.
Φυσικά, λάβετε υπόψη ότι εάν εκτελείτε από μόνη της, η διεπαφή χρήστη, όπως τα κουμπιά,SampleSceneChild
δεν θα λειτουργήσει.
Μπορείτε να δείτε ότι τα αρχεία καταγραφής του EventSystem έχουν εξαφανιστεί όταν το εκτελείτε.
SampleSceneParent
Επίσης, δεδομένου ότι υπάρχειEventSystem
, τα κουμπιά στην παιδική σκηνή μπορούν να ενεργοποιηθούν.
Διορθώστε σφάλματα AudioListeners
Τα περιεχόμενα του αρχείου καταγραφής έχουν ως εξής.
Υπάρχουν 2 ακροατές ήχου στη σκηνή. Βεβαιωθείτε ότι υπάρχει πάντα ακριβώς ένας ακροατής ήχου στη σκηνή.
(Υπάρχουν δύο ακροατές ήχου στη σκηνή.) Βεβαιωθείτε ότι υπάρχει μόνο ένας ακροατής ήχου στη σκηνή ανά πάσα στιγμή. )
Main Camera
Αν κοιτάξετε τα στοιχεία του , μπορείτε σίγουρα να δείτε ότι υπάρχει το Audio Listener, ώστε SampleSceneChild
να μπορείτε να διαγράψετε το Audio Listener στο .
Μπορεί να λυθεί με έλεγχο κάμερας του επόμενου στοιχείου, οπότε θα το αντιμετωπίσουμε εκεί.
Εάν θέλετε να διατηρήσετε την κάμερα,SampleSceneChild
θα διαγράψετε αυτό το πρόγραμμα ακρόασης ήχου.
Αλλαγή της κάμερας ώστε να εμφανίζει δύο σκηνές
Όσον αφορά την αιτία που εμφανίζεται μόνο ο καμβάς της παιδικής σκηνής κατά την προσθήκη μιας παιδικής σκηνής, Αυτό συμβαίνει επειδή υπάρχουν δύο κάμερες, η γονική σκηνή και η παιδική σκηνή στον καμβά και εμφανίζεται μόνο μία κάμερα.
Η λύση σε αυτό είναι να εμφανίσετε τον καμβά και των δύο σκηνών με την κάμερα της γονικής σκηνής. Η διαδικασία είναι να αντικαταστήσετε την κάμερα στον καμβά της παιδικής σκηνής με την κάμερα της γονικής σκηνής μετά την προσθήκη της παιδικής σκηνής.
Ας δημιουργήσουμε ένα σενάριο. Το όνομα είναι αυθαίρετο, αλλά στην περίπτωση ChildSceneCamera
αυτή είναι .
Το σενάριο μοιάζει με αυτό: Canvas
Είναι μια προαπαιτούμενη διαδικασία για να επισυνάψετε στο .
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
Η μέθοδος εκτελείται την πρώτη φορά που το αντικείμενο υπάρχει στη σκηνή. Start
Εκτελείται πριν από τη μέθοδο.
Είναι καλό να θυμάστε ότι το χρησιμοποιείτε συχνά.
Αυτή τη φορά, θεωρείται ότι θα εκτελεστεί όταν προστεθεί η παιδική σκηνή.
<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
της παιδικής σκηνής. Ακόμα κι αν φύγει, δεν υπάρχει πρόβλημα γιατί μπορεί να καλυφθεί από την κάμερα της σκηνής του γονέα.
Ο στόχος Canvas.worldCamera
διαγραφής ανακτάται από το .
Είναι ακριβώς επειδή η ίδια κάμερα που έχει η σκηνή σε αυτό το σημείο έχει ρυθμιστεί και μπορεί εύκολα να αποκτηθεί.
Εάν θέλετε πραγματικά να το διαγράψετε, καλύτερα να πάρετε την κάμερα από τη σκηνή.
// 子のシーンのカメラを削除
Object.Destroy(childCanvas.worldCamera.gameObject);
Τέλος, η παιδική σκηνή Canvas.worldCamera
αντικαθίσταται με την κάμερα του γονέα.
// 子のシーンのキャンバスのカメラを親のシーンのカメラに置き換えます
childCanvas.worldCamera = parentCanvas.worldCamera;
Αφού SampleSceneChild
αποθηκεύσετε τη δέσμη ενεργειών, επισυνάψτε την στο . Canvas
Είναι εντάξει εάν το αποτέλεσμα της εκτέλεσης και της προσθήκης μιας παιδικής σκηνής είναι όπως φαίνεται στο παρακάτω σχήμα. Βεβαιωθείτε ότι δεν υπάρχουν αρχεία καταγραφής.