添加場景

更新頁 :
頁面創建日期 :

驗證環境

窗戶
  • 視窗 11
統一編輯器
  • 2020.3.25f1
輸入系統包
  • 1.2.0

此提示的先決條件

作為此提示描述的前提,已預先進行了以下設置。

關於添加場景

Unity 允許您同時顯示多個場景。 當您只想疊加場景或將繪圖導出為其他紋理時,請使用它。

這次,我想解釋一下場景的疊加顯示,假設在遊戲運行時遊戲運行時,功能表屏幕顯示在前景中。

顯示多個場景時,應注意以下事項:

  • 事件系統不得超過一個
  • 音訊偵聽器不得超過一個
  • 處理多台相機時要小心

準備場景

這次,我們將準備兩個場景。 設 , SampleSceneParent另外要顯示的場景 SampleSceneChild 是 。 準備兩個場景的方法和前面的技巧一樣,請參考一下。

這一次,我們將創建以下佈局。 如果單擊父場景中的按鈕,則除了添加子場景外,沒有任何問題。 放置精靈是為了更容易 Canvas 理解稍後將看到的癥狀。

樣本場景父級

樣本場景兒童

顯示多個場景時,物件的上下文取決於每個物件的“圖層順序”,而不考慮場景單位。 由於初始值均為 0,因此請將 no 和子畫面設置為SampleSceneChildCanvas“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 設置方法。

嘗試運行遊戲以查看其工作原理。 如果按下該按鈕,您將看到子場景。

此外,如果您查看層次結構,您可以看到有兩個場景。

但是,儘管已添加場景,但似乎未顯示父場景的 Canvas 的內容。 相反,您可以看到父場景中的精靈根據圖層的順序顯示在背面。

此外,如果您查看主控台,您可以看到日誌不斷輸出。

內容有以下兩點。

  • 場景中有2個事件系統。 請確保場景中始終只有一個事件系統
  • 場景中有 2 個音訊偵聽器。 請確保場景中始終只有一個音訊偵聽器。

當使用多個場景時,需要對應這兩個點和相機。

修復事件系統錯誤

日誌的內容如下。

場景中有2個事件系統。 請確保場景中始終只有一個事件系統

(場景中有兩個事件系統。 確保場景中始終有一個事件系統)

如前所述,將事件系統組合成一個解決方案將解決問題。

SampleSceneParent 假定始終存在,SampleSceneChild 因此請在打開它時 EventSystem 將其刪除。

當然,請注意,如果您自行運行,SampleSceneChild 按鈕等UI將不起作用。

您可以看到,當您運行事件系統日誌時,它已消失。

SampleSceneParent此外,由於存在EventSystem,因此可以激活子場景中的按鈕。

修復音訊偵聽器錯誤

日誌的內容如下。

場景中有 2 個音訊偵聽器。 請確保場景中始終只有一個音訊偵聽器。

(場景中有兩個音訊偵聽器。 確保場景中始終只有一個音頻偵聽器。 )

Main Camera 如果您查看 的元件,您當然可以看到音訊偵聽器存在,因此 SampleSceneChild 您可以刪除 中的音訊偵聽器。 它可以通過相機控制下一個項目來解決,因此我們將在那裡處理它。

如果要保留相機,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

如果執行並添加子場景的結果如下圖所示,則可以。 確保也沒有日誌。