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來進行場景和關卡的管理。async

介紹

通過5個版本的發展, Unity5.3放出了統一合理的場景管理API。 在以前的版本中場景即代碼中關卡(Level)。 可是使用Unity過程當中很快便發現用場景來定義不一樣的關卡不是必須的,因此就引入了 Scene API.
以前版本中的關卡在邏輯角度上指明瞭此關卡的構建索引號(即Build Settins中此關卡的序號), 場景則指明他們的包含該場景的資源名。 然而這兩個概念都不是識別一個真正場景的可靠惟一ID。Build Settings中移動場景會改變他們的索引。一樣的,不一樣文件夾下可能會有兩個相同名字的場景。Unity5.3嘗試結束這些混亂的邏輯。函數

5.3版本中新的場景API

Unity5.3以前使用構建索引場景資源名都能指向一個場景。Unity5.3引入了一個新的Scene結構體來指明一個場景。它封裝了一些場景經常使用方法和變量如buildIndexnamepathui

訪問SceneManager

要想使用新的場景API,C#代碼須要引用SceneManagement命名空間spa

1
using UnityEngine.SceneManagement;

 

這樣就可使用SceneManager類來替換Application中廢棄的相關場景函數。code

獲取當前場景

Unity改用「場景」而不是「關卡」的一個主要緣由是你能夠同時加載多個場景。這樣就破壞了「當前關卡」這個概念,它如今被替換成了「激活場景」。多數狀況下,激活場景爲最新加載的場景。咱們能夠任意時刻使用GetActiveScene獲取激活場景。blog

1
2
3
4
5
6
7
8
// 5.3
Scene scene = SceneManager.GetActiveScene();
Debug.Log(scene.name);
Debug.Log(scene.buildIndex);

// 5.2
Debug.Log(Application.loadedLevelName);
Debug.Log(Application.loadedLevel);

 

檢測激活場景是否是某個指定場景名:索引

1
2
3
4
if (SceneManager.GetActiveScene().name == "sceneName")
{
// ...
}

 

也可使用重載的==操做符來檢測:資源

1
2
3
4
if (SceneManager.GetActiveScene() == scene)
{
// ...
}

 

加載場景

和以前的版本同樣,咱們能夠經過構建索引和場景名來加載場景,兩個場景名同樣但路徑不一樣的話推薦使用路徑來加載指定場景,不然Unity會加載第一個匹配名字的場景。string

加載單個場景

默認是加載單個場景,加載新場景會卸載全部已加載的舊場景,銷燬全部舊場景的GameObjects

1
2
3
4
5
6
7
8
// 5.3
SceneManager.LoadScene(4);
SceneManager.LoadScene("sceneName"); //場景名方式,忽略大小寫
SceneManager.LoadScene("path/to/scene/file/sceneName");//場景資源路徑方式,忽略大小寫

// 5.2
Application.LoadLevel(4);
Application.LoadLevel("sceneName");

 

異步版本:

1
2
3
4
5
6
7
8
// 5.3
SceneManager.LoadSceneAsync(4);
SceneManager.LoadSceneAsync("sceneName");
SceneManager.LoadSceneAsync("path/to/scene/file/sceneName");

// 5.2
Application.LoadLevelAsync(4);
Application.LoadLevelAsync("sceneName");

 

添加方式加載場景

咱們也能夠經過指定SceneManagement.LoadSceneMode.Additive以添加新場景的方式來加載新場景:

1
2
3
4
5
6
7
8
// 5.3
SceneManager.LoadScene(4, SceneManagement.LoadSceneMode.Additive);
SceneManager.LoadScene("sceneName", SceneManagement.LoadSceneMode.Additive);
SceneManager.LoadScene("path/to/scene/file/sceneName", SceneManagement.LoadSceneMode.Additive);

// 5.2
Application.LoadLevelAdditive(4);
Application.LoadLevelAdditive("sceneName");

 

異步版本:

1
2
3
4
5
6
7
8
// 5.3
SceneManager.LoadSceneAsync(4, SceneManagement.LoadSceneMode.Additive);
SceneManager.LoadSceneAsync("sceneName", SceneManagement.LoadSceneMode.Additive);
SceneManager.LoadSceneAsync("path/to/scene/file/sceneName", SceneManagement.LoadSceneMode.Additive);

// 5.2
Application.LoadLevelAdditiveAsync(4);
Application.LoadLevelAdditiveAsync("sceneName");

 

卸載場景

Unity5.3同時也提供UnloadScene方法來卸載指定場景:

1
2
3
4
// 5.3
SceneManager.UnloadScene(4); // 經過構建索引卸載
SceneManager.UnloadScene("sceneName"); // 經過場景名或場景路徑卸載
SceneManager.UnloadScene(sceneStruct); // 經過Scene結構體卸載(加載場景卻沒有提供經過Scene結構體加載的方式)

 

該函數返回是否成功卸載場景。

總結

上面簡單介紹了5.3版本中的場景管理API, 咱們看到Unity中新的場景管理方式提供了一種更清晰可靠的動態加載管理的流程。若是你在用5.3版本仍是儘快更新代碼使用新API來管理場景吧。

相關文章
相關標籤/搜索