1. 程式人生 > >unity 5.3 以後加載場景

unity 5.3 以後加載場景

RR manager 所有 any 相同 path easy table 我們

記錄下官方建議的加載場景的方法:

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之前使用構建索引

場景資源名都能指向一個場景。Unity5.3引入了一個新的Scene結構體來指明一個場景。它封裝了一些場景常用方法和變量如buildIndex, namepath

訪問SceneManager

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

1
using UnityEngine.SceneManagement;

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

獲取當前場景

Unity改用“場景”而不是“關卡”的一個主要原因是你可以同時加載多個場景。這樣就破壞了“當前關卡”這個概念,它現在被替換成了“激活場景”。多數情況下,激活場景為最新加載的場景。我們可以任意時刻使用GetActiveScene獲取激活場景。

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會加載第一個匹配名字的場景。

加載單個場景

默認是加載單個場景,加載新場景會卸載所有已加載的舊場景,銷毀所有舊場景的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來管理場景吧。

unity 5.3 以後加載場景