添加場景
驗證環境
- 窗戶
-
- 視窗 11
- 統一編輯器
-
- 2020.3.25f1
- 輸入系統包
-
- 1.2.0
此提示的先決條件
作為此提示描述的前提,已預先進行了以下設置。
關於添加場景
Unity 允許您同時顯示多個場景。 當您只想疊加場景或將繪圖導出為其他紋理時,請使用它。
這次,我想解釋一下場景的疊加顯示,假設在遊戲運行時遊戲運行時,功能表屏幕顯示在前景中。
顯示多個場景時,應注意以下事項:
- 事件系統不得超過一個
- 音訊偵聽器不得超過一個
- 處理多台相機時要小心
準備場景
這次,我們將準備兩個場景。 設 , SampleSceneParent
另外要顯示的場景 SampleSceneChild
是 。
準備兩個場景的方法和前面的技巧一樣,請參考一下。
這一次,我們將創建以下佈局。 如果單擊父場景中的按鈕,則除了添加子場景外,沒有任何問題。
放置精靈是為了更容易 Canvas
理解稍後將看到的癥狀。
樣本場景父級
樣本場景兒童
顯示多個場景時,物件的上下文取決於每個物件的“圖層順序”,而不考慮場景單位。
由於初始值均為 0,因此請將 no 和子畫面設置為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
設置方法。
嘗試運行遊戲以查看其工作原理。 如果按下該按鈕,您將看到子場景。
此外,如果您查看層次結構,您可以看到有兩個場景。
但是,儘管已添加場景,但似乎未顯示父場景的 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
如果執行並添加子場景的結果如下圖所示,則可以。 確保也沒有日誌。