記錄下官方建議的加載場景的方法:異步
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
來進行場景和關卡的管理。async
通過5個版本的發展, Unity5.3放出了統一合理的場景管理API。 在以前的版本中場景即代碼中關卡(Level
)。 可是使用Unity過程當中很快便發現用場景來定義不一樣的關卡不是必須的,因此就引入了 Scene
API.
以前版本中的關卡在邏輯角度上指明瞭此關卡的構建索引號(即Build Settins中此關卡的序號), 場景則指明他們的包含該場景的資源名。 然而這兩個概念都不是識別一個真正場景的可靠惟一ID。Build Settings中移動場景會改變他們的索引。一樣的,不一樣文件夾下可能會有兩個相同名字的場景。Unity5.3嘗試結束這些混亂的邏輯。函數
Unity5.3以前使用構建索引和場景資源名都能指向一個場景。Unity5.3引入了一個新的Scene
結構體來指明一個場景。它封裝了一些場景經常使用方法和變量如buildIndex
, name
和path
。ui
SceneManager
類要想使用新的場景API,C#代碼須要引用SceneManagement
命名空間spa
1 |
using UnityEngine.SceneManagement; |
這樣就可使用SceneManager
類來替換Application
中廢棄的相關場景函數。code
Unity改用「場景」而不是「關卡」的一個主要緣由是你能夠同時加載多個場景。這樣就破壞了「當前關卡」這個概念,它如今被替換成了「激活場景」。多數狀況下,激活場景爲最新加載的場景。咱們能夠任意時刻使用GetActiveScene
獲取激活場景。blog
1 |
// 5.3 |
檢測激活場景是否是某個指定場景名:索引
1 |
if (SceneManager.GetActiveScene().name == "sceneName") |
也可使用重載的==
操做符來檢測:資源
1 |
if (SceneManager.GetActiveScene() == scene) |
和以前的版本同樣,咱們能夠經過構建索引和場景名來加載場景,兩個場景名同樣但路徑不一樣的話推薦使用路徑來加載指定場景,不然Unity會加載第一個匹配名字的場景。string
默認是加載單個場景,加載新場景會卸載全部已加載的舊場景,銷燬全部舊場景的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來管理場景吧。