Ajouter une scène

Page mise à jour :
Date de création de la page :

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 SampleSceneParentla 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.