Ajouter une scène
Environnement de vérification
- Windows
-
- Fenêtres 11
- Éditeur Unity
-
- 2020.3.25f1
- Package système d’entrée
-
- 1.2.0
Conditions préalables à cette astuce
Les paramètres suivants ont été définis à l’avance comme prémisse pour la description de cette astuce.
A propos de l’ajout d’une scène
Unity vous permet d’afficher plusieurs scènes en même temps. Utilisez-le lorsque vous souhaitez simplement superposer des scènes ou exporter vos dessins vers une texture différente.
Cette fois, je voudrais expliquer l’affichage superposé de la scène en supposant que l’écran de menu est affiché au premier plan pendant que le jeu est en cours d’exécution pendant que le jeu est en cours d’exécution.
Lorsque vous affichez plusieurs scènes, vous devez tenir compte des points suivants :
- Il ne doit pas y avoir plus d’un EventSystem
- Il ne doit pas y avoir plus d’un auditeur audio
- Soyez prudent lorsque vous manipulez plusieurs caméras
Préparer la scène
Cette fois, nous allons préparer deux scènes. Soit , et SampleSceneParent
la scène SampleSceneChild
à afficher en plus est .
La méthode de préparation de deux scènes est la même que les conseils précédents, veuillez donc vous y référer.
Cette fois, nous allons créer la mise en page suivante. Si vous cliquez sur le bouton dans la scène parente, il n’y a aucun problème, sauf pour ajouter la scène enfant.
Et les sprites sont placés pour faciliter Canvas
la compréhension des symptômes que vous verrez plus tard.
SampleSceneParent
Exemple ScèneEnfant
Lorsque plusieurs scènes sont affichées, le contexte des objets dépend de « l’ordre des couches » de chaque objet, quelle que soit l’unité de scène.
Étant donné que les valeurs initiales sont toutes 0, laissez SampleSceneChild
Canvas
le non et les sprites définis sur « 1 ».
N’oubliez pas de définir les deux scènes dans les paramètres de construction.
Traitement des scènes
Il est traité dans le code de la même manière que le changement de scène. Cette fois aussi, il est traité lorsque le bouton est cliqué, mais il est traité comme un ajout au lieu d’un commutateur de scène.
Le nom du fichier de script est arbitraire, mais ici SceneAdd
il s’agit de .
Le script ressemble à ceci :
using UnityEngine;
using UnityEngine.SceneManagement; // 追加
public class SceneAdd : MonoBehaviour
{
<summary>ボタンをクリックしたときに呼ばれます。</summary>
public void OnClick()
{
// 指定したシーンを追加します
SceneManager.LoadScene("SampleSceneChild", LoadSceneMode.Additive);
}
}
Lorsque je change de scène, LoadSceneMode
j’ai réglé sur , Single
mais cette fois Additive
c’est .
C’est tout ce qu’il y a à faire la différence.
Après SampleSceneParent
avoir enregistré le script, joignez-le à . EventSystem
Définissez la méthode sur le OnClick
bouton.
Essayez d’exécuter le jeu pour voir comment cela fonctionne. Si vous cliquez sur le bouton, vous verrez la scène enfant.
De plus, si vous regardez la hiérarchie, vous pouvez voir qu’il y a deux scènes.
Cependant, malgré le fait que la scène a été ajoutée, il semble que le contenu du canevas de la scène parent ne soit pas affiché. Inversement, vous pouvez voir que les sprites de la scène parent sont affichés à l’arrière selon l’ordre des calques.
De plus, si vous regardez la console, vous pouvez voir que les journaux sont constamment publiés.
Le contenu est les deux points suivants.
- Il y a 2 systèmes d’événements dans la scène. Veuillez vous assurer qu’il y a toujours exactement un système d’événements dans la scène
- Il y a 2 auditeurs audio dans la scène. Veuillez vous assurer qu’il y a toujours exactement un auditeur audio dans la scène.
Lors de l’utilisation de plusieurs scènes, il est nécessaire de correspondre à ces deux points et à la caméra.
Corriger les erreurs EventSystem
Le contenu du journal est le suivant.
Il y a 2 systèmes d’événements dans la scène. Veuillez vous assurer qu’il y a toujours exactement un système d’événements dans la scène
(Il y a deux systèmes d’événements dans la scène.) Assurez-vous de toujours avoir un système d’événements dans votre scène)
Tel qu’écrit, la combinaison de l’EventSystem en une seule solution résoudra le problème.
SampleSceneParent
est supposé exister toujours,SampleSceneChild
donc supprimez-le lorsque EventSystem
vous l’ouvrez.
Bien sûr, veuillez noter que si vous exécutez seul,SampleSceneChild
l’interface utilisateur telle que les boutons ne fonctionnera pas.
Vous pouvez voir que les journaux EventSystem ont disparu lorsque vous l’exécutez.
SampleSceneParent
De plus, puisqu’il est EventSystem
présent, les boutons de la scène de l’enfant peuvent être activés.
Corriger les erreurs AudioListeners
Le contenu du journal est le suivant.
Il y a 2 auditeurs audio dans la scène. Veuillez vous assurer qu’il y a toujours exactement un auditeur audio dans la scène.
(Il y a deux auditeurs audio dans la scène.) Assurez-vous qu’il n’y a qu’un seul auditeur audio dans la scène à tout moment. )
Main Camera
Si vous examinez les composants de , vous pouvez certainement voir que l’écouteur audio existe, vous pouvez donc SampleSceneChild
supprimer l’écouteur audio dans .
Il peut être résolu par le contrôle de la caméra de l’élément suivant, nous allons donc le traiter ici.
Si vous souhaitez conserver la caméra,SampleSceneChild
vous supprimerez cet écouteur audio.
Changez la caméra pour afficher deux scènes
Quant à la cause que seul le canevas de la scène enfant est affiché lors de l’ajout d’une scène enfant, En effet, il y a deux caméras, la scène parent et la scène enfant définies sur la toile, et une seule caméra est affichée.
La solution consiste à afficher la toile des deux scènes avec la caméra de la scène parente. Le processus consiste à remplacer la caméra sur le canevas de la scène enfant par la caméra de la scène parent après l’ajout de la scène enfant.
Créons un script. Le nom est arbitraire, mais dans ce cas ChildSceneCamera
, il est .
Le script ressemble à ceci : Canvas
Il s’agit d’un processus préalable à attacher à .
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
La méthode est exécutée la première fois que l’objet existe dans la scène. Start
S’exécute avant la méthode.
Il est bon de se rappeler que vous l’utilisez souvent souvent.
Cette fois, il est supposé qu’il sera exécuté lorsque la scène de l’enfant est ajoutée.
<summary>シーンに追加されたタイミングで処理されます。</summary>
void Awake()
{
// 処理
}
Obtenez le canevas de scène parent et le canevas de scène enfant pour remplacer la caméra. Il y a plusieurs façons de le faire, mais ce n’est pas le sujet principal, donc vous pouvez penser que vous pouvez l’obtenir si vous le faites de cette façon pour le moment.
// 親のシーンのキャンバスを取得
var parentScene = SceneManager.GetSceneByName("SampleSceneParent");
var parentCanvas = parentScene.GetRootGameObjects().First(obj => obj.GetComponent<Canvas>() != null).GetComponent<Canvas>();
// 子のシーンのキャンバスを取得
var childCanvas = GetComponent<Canvas>();
Détruisez d’abord la caméra Object.Destroy
de la scène enfant. Même s’il est parti, il n’y a pas de problème car il peut être couvert par la caméra de la scène du parent.
La cible Canvas.worldCamera
de suppression est extraite de .
C’est juste parce que la même caméra que la scène a à ce stade est réglée et peut être facilement acquise.
Si vous voulez vraiment le supprimer, vous feriez mieux de retirer la caméra de la scène.
// 子のシーンのカメラを削除
Object.Destroy(childCanvas.worldCamera.gameObject);
Enfin, la scène Canvas.worldCamera
de l’enfant est remplacée par la caméra du parent.
// 子のシーンのキャンバスのカメラを親のシーンのカメラに置き換えます
childCanvas.worldCamera = parentCanvas.worldCamera;
Après SampleSceneChild
avoir enregistré le script, joignez-le à . Canvas
Ce n’est pas grave si le résultat de l’exécution et de l’ajout d’une scène enfant est comme indiqué dans la figure ci-dessous. Assurez-vous qu’il n’y a pas de journaux non plus.