Aggiungere una scena

Pagina aggiornata :
Data di creazione della pagina :

Ambiente di verifica

Finestre
  • Windows 11
Unity Editor
  • 2020.3.25F1
Pacchetto del sistema di input
  • 1.2.0

Prerequisiti per questo suggerimento

Le seguenti impostazioni sono state effettuate in anticipo come premessa per la descrizione di questo suggerimento.

Informazioni sull'aggiunta di una scena

Unity consente di visualizzare più scene contemporaneamente. Usalo quando vuoi semplicemente sovrapporre scene o esportare i tuoi disegni in una trama diversa.

Questa volta, vorrei spiegare la visualizzazione sovrapposta della scena supponendo che la schermata del menu venga visualizzata in primo piano mentre il gioco è in esecuzione mentre il gioco è in esecuzione.

Quando si visualizzano più scene, è necessario tenere presente quanto segue:

  • Non deve essere presente più di un EventSystem
  • Non deve essere presente più di un ascoltatore audio
  • Prestare attenzione quando si maneggiano più telecamere

Preparare la scena

Questa volta, prepareremo due scene. Sia , e SampleSceneParentla scena SampleSceneChild da visualizzare in aggiunta è . Il metodo di preparazione di due scene è lo stesso dei suggerimenti precedenti, quindi si prega di fare riferimento a loro.

Questa volta, creeremo il seguente layout. Se si fa clic sul pulsante nella scena principale, non vi è alcun problema se non quello di aggiungere la scena figlio. e gli sprite sono posizionati per rendere più facile capire Canvas i sintomi che vedrai in seguito.

Metodo SampleSceneParent

Metodo SampleSceneChild

Quando vengono visualizzate più scene, il contesto degli oggetti dipende dall'"ordine dei livelli" di ciascun oggetto, indipendentemente dall'unità della scena. Poiché i valori iniziali sono tutti 0, lasciare SampleSceneChild Canvas no e sprite impostati su "1".

Non dimenticare di impostare le due scene nelle impostazioni di compilazione.

Elaborazione delle scene

Viene elaborato nel codice allo stesso modo del passaggio da una scena all'altra. Anche questa volta, viene elaborato quando si fa clic sul pulsante, ma viene elaborato come un'aggiunta anziché un cambio di scena.

Il nome del file di script è arbitrario, ma eccolo qui SceneAdd .

Lo script è simile al seguente:

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

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

Quando cambio scena, ho impostato su , LoadSceneMode Single ma questa volta Additive è . Questo è tutto ciò che c'è da fare la differenza.

Dopo SampleSceneParent aver salvato lo script, allegarlo a . EventSystem

Impostare il metodo sul OnClick pulsante.

Prova a eseguire il gioco per vedere come funziona. Se fai clic sul pulsante, vedrai la scena figlio.

Inoltre, se guardi la gerarchia, puoi vedere che ci sono due scene.

Tuttavia, nonostante il fatto che la scena sia stata aggiunta, sembra che il contenuto del Canvas della scena principale non venga visualizzato. Al contrario, potete vedere che gli sprite nella scena principale vengono visualizzati sul retro in base all'ordine dei livelli.

Inoltre, se guardi la console, puoi vedere che i registri vengono costantemente emessi.

Il contenuto è costituito dai due punti seguenti.

  • Ci sono 2 sistemi di eventi nella scena. Assicurati che ci sia sempre esattamente un sistema di eventi nella scena
  • Ci sono 2 ascoltatori audio nella scena. Assicurati che ci sia sempre esattamente un ascoltatore audio nella scena.

Quando si utilizzano più scene, è necessario corrispondere a questi due punti e alla fotocamera.

Correggere gli errori di EventSystem

Il contenuto del registro è il seguente.

Ci sono 2 sistemi di eventi nella scena. Assicurati che ci sia sempre esattamente un sistema di eventi nella scena

(Ci sono due sistemi di eventi nella scena.) Assicurati di avere sempre un sistema di eventi nella tua scena)

Come scritto, combinando l'EventSystem in un'unica soluzione si risolverà il problema.

SampleSceneParent si presume che esista sempre,SampleSceneChild quindi eliminalo quando EventSystem lo apri.

Naturalmente, tieni presente che se esegui da solo,SampleSceneChild l'interfaccia utente come i pulsanti non funzionerà.

È possibile vedere che i registri di EventSystem sono scomparsi quando viene eseguito.

SampleSceneParent Inoltre, poiché è EventSystem presente, i pulsanti nella scena figlio possono essere attivati.

Correggere gli errori di AudioListeners

Il contenuto del registro è il seguente.

Ci sono 2 ascoltatori audio nella scena. Assicurati che ci sia sempre esattamente un ascoltatore audio nella scena.

(Ci sono due ascoltatori audio nella scena.) Assicurati che ci sia sempre un solo ascoltatore audio nella scena. )

Main Camera Se si osservano i componenti di , si può certamente vedere che il listener audio esiste, quindi SampleSceneChild è possibile eliminare il listener audio in . Può essere risolto con il controllo della telecamera dell'elemento successivo, quindi ce ne occuperemo lì.

Se si desidera mantenere la fotocamera,SampleSceneChild si eliminerà questo ascoltatore audio.

Cambiare la fotocamera per mostrare due scene

Per quanto riguarda la causa per cui solo l'area di disegno della scena figlio viene visualizzata quando si aggiunge una scena figlio, Questo perché ci sono due telecamere, la scena principale e la scena figlio impostate nell'area di disegno, e viene visualizzata una sola fotocamera.

La soluzione consiste nel visualizzare l'area di lavoro di entrambe le scene con la fotocamera della scena principale. Il processo consiste nel sostituire la videocamera nell'area di disegno della scena secondaria con la fotocamera della scena principale dopo l'aggiunta della scena figlio.

Creiamo uno script. Il nome è arbitrario, ma in questo caso ChildSceneCamera è .

Lo script è simile al seguente: Canvas È un processo prerequisito da collegare a .

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 Il metodo viene eseguito la prima volta che l'oggetto è presente nella scena. Start Esegue prima del metodo. È bene ricordare che lo usi spesso spesso. Questa volta, si presume che verrà eseguito quando viene aggiunta la scena figlio.

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

Ottenere l'area di disegno della scena principale e l'area di disegno della scena secondaria per sostituire la fotocamera. Ci sono vari modi per farlo, ma non è l'argomento principale, quindi puoi pensare di poterlo ottenere se lo fai in questo modo per il momento.

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

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

Distruggi prima la telecamera Object.Destroy della scena bambino. Anche se è sparito, non c'è problema perché può essere coperto dalla telecamera della scena del genitore. La destinazione Canvas.worldCamera di eliminazione viene recuperata da . È solo perché la stessa telecamera che la scena ha a questo punto è impostata e può essere facilmente acquisita. Se vuoi effettivamente eliminarlo, è meglio ottenere la fotocamera dalla scena.

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

Infine, la scena Canvas.worldCamera del bambino viene sostituita con la fotocamera del genitore.

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

Dopo SampleSceneChild aver salvato lo script, allegarlo a . Canvas

È OK se il risultato dell'esecuzione e dell'aggiunta di una scena figlio è come mostrato nella figura seguente. Assicurati che non ci siano registri.