unity 5.3 以後加載場景
記錄下官方建議的加載場景的方法:
StartCoroutine(LoadYourAsyncScene()); IEnumerator LoadYourAsyncScene() { // The Application loads the Scene in the background at the same time as the current Scene. //This is particularly good for creating loading screens. You could also load the Scene by build//number. AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(scene_name); //Wait until the last operation fully loads to return anything while (!asyncLoad.isDone) { yield return null; } }
本文介紹如何使用Unity5.3引入的新API UnityEngine.SceneManagement
來進行場景和關卡的管理。
介紹
經過5個版本的發展, Unity5.3放出了統一合理的場景管理API。 在之前的版本中場景即代碼中關卡(Level
)。 但是使用Unity過程中很快便發現用場景來定義不同的關卡不是必須的,所以就引入了 Scene
API.
之前版本中的關卡在邏輯角度上指明了此關卡的構建索引號(即Build Settins中此關卡的序號), 場景則指明他們的包含該場景的資源名。 然而這兩個概念都不是識別一個真正場景的可靠唯一ID。Build Settings中移動場景會改變他們的索引。同樣的,不同文件夾下可能會有兩個相同名字的場景。Unity5.3嘗試結束這些混亂的邏輯。
5.3版本中新的場景API
Unity5.3之前使用構建索引
Scene
結構體來指明一個場景。它封裝了一些場景常用方法和變量如buildIndex
, name
和path
。
訪問SceneManager
類
要想使用新的場景API,C#代碼需要引用SceneManagement
命名空間
1
|
using UnityEngine.SceneManagement;
|
這樣就可以使用SceneManager
類來替換Application
中廢棄的相關場景函數。
獲取當前場景
Unity改用“場景”而不是“關卡”的一個主要原因是你可以同時加載多個場景。這樣就破壞了“當前關卡”這個概念,它現在被替換成了“激活場景”。多數情況下,激活場景為最新加載的場景。我們可以任意時刻使用GetActiveScene
獲取激活場景。
1
|
// 5.3
|
檢測激活場景是不是某個指定場景名:
1
|
if (SceneManager.GetActiveScene().name == "sceneName")
|
也可以使用重載的==
操作符來檢測:
1
|
if (SceneManager.GetActiveScene() == scene)
|
加載場景
和之前的版本一樣,我們可以通過構建索引和場景名來加載場景,兩個場景名一樣但路徑不同的話推薦使用路徑來加載指定場景,否則Unity會加載第一個匹配名字的場景。
加載單個場景
默認是加載單個場景,加載新場景會卸載所有已加載的舊場景,銷毀所有舊場景的GameObjects
。
1
|
// 5.3
|
異步版本:
1
|
// 5.3
|
添加方式加載場景
我們也可以通過指定SceneManagement.LoadSceneMode.Additive
以添加新場景的方式來加載新場景:
1
|
// 5.3
|
異步版本:
1
|
// 5.3
|
卸載場景
Unity5.3同時也提供UnloadScene
方法來卸載指定場景:
1
|
// 5.3
|
該函數返回是否成功卸載場景。
總結
上面簡單介紹了5.3版本中的場景管理API, 我們看到Unity中新的場景管理方式提供了一種更清晰可靠的動態加載管理的流程。如果你在用5.3版本還是盡快更新代碼使用新API來管理場景吧。
unity 5.3 以後加載場景