【Unity3D技術文檔翻譯】第1.6篇 使用 AssetBundle Manager


Unity3D技術文檔翻譯

上一章:【Unity3D技術文檔翻譯】第1.5篇 使用 AssetBundles

本章原文所在章節:【Unity Manual】→【Working in Unity】→【Advanced Development】→【AssetBundles】→【AssetBundle Manager】

AssetBundle Manager

AssetBundle Manager 是一個可以讓你更簡單地使用 AssetBundle 的工具,點擊鏈接下載。(這里要吐槽一下,官方文檔給的鏈接是 AssetStore 里的老版本,最近更新日期是15年11月,根本無法使用。最新版需要去官方 bitbucket 上下載,上面的鏈接我已經替換成 bitbucket 上 AssetBundle Manager 的鏈接)

下載並導入 AssetBundle Manager 安裝包,這不僅添加了一套加載和使用 AssetBundle 的API,還增加了一些編輯器功能,使 AssetBundle 工作流更簡單。增加的編輯器功能可以在 Assets 菜單按鈕下找到。
Assets > AssetBundles

增加的按鈕選項包含以下幾個部分:

Assets > AssetBundles 菜單項

模擬模式(Simulation Mode)

使用模擬模式,AssetBundle Manager 不用實際創建就可以使用 AssetBundle。編輯器會查看哪些資源被分配給 AssetBundles,然后直接使用這些資源,而不是真的從 AssetBundle 中獲取。

使用模擬模式主要的好處是資源可以直接被修改、更新、添加和刪除,而不需要每次都重新創建和部署 AssetBundles。

需要注意的是,AssetBundle 版本變量在模擬模式中不能使用。如果你要使用版本變量,你需要選擇“本地 AssetBundle 服務器(Local AssetBundle Server)”選項。

本地 AssetBundle 服務器(Local AssetBundle Server)

AssetBundle Manager 可以開啟“本地 AssetBundle 服務器”模式,這樣你就可以在編輯器或者本地設備(包括移動設備)上測試 AssetBundles。

使用“本地 AssetBundle 服務器”模式的前提是,你必須在根目錄下創建一個名為“AssetBundles”的文件夾(與 Assets 文件夾同級)。如下:

創建一個“AssetBundles”的文件夾

創建好文件夾后,你就需要將你的 AssetBundles 編譯構建到該文件夾。在上面提到的 Assets > AssetBundles 菜單項中選擇 Build AssetBundles 選項,它將把你的 AssetBundles 構建到上面創建的文件夾內。

現在,你的 AssetBundles 已經構建好了(或者你使用了模擬模式),是時候開始加載 AssetBundles。我們來看一下 AssetBundle Manager 提供的新 API。

AssetBundleManager.Initialize()

該方法將加載 AssetBundleManifest 對象。在開始使用 AssetBundle Manager 加載資源之前,你需要先調用該方法。如下:

IEnumerator Start()
{
    yield return StartCoroutine(Initialize());
}
IEnumerator Initialize()
{
    var request = AssetBundleManager.Initialize();
if (request != null)
    yield return StartCoroutine(request);
}

AssetBundle Manager 將使用 Initialize() 方法加載好的 manifest,在幕后提供一些有幫助的特性,包括依賴管理。

加載資源(Assets)

讓我們來認真思考一下。我們正在使用 AssetBundle Manager,我們已經初始化(initialize)了它,現在是時候准備加載一些資源。下面一段代碼展示了如何加載 AssetBundle 並實例化一個對象:

IEnumerator InstantiateGameObjectAsync (string assetBundleName, string assetName)
{
    // Load asset from assetBundle.
    AssetBundleLoadAssetOperation request = AssetBundleManager.LoadAssetAsync(assetBundleName, assetName, typeof(GameObject) );
    if (request == null)
        yield break;
    yield return StartCoroutine(request);
    // Get the asset.
    GameObject prefab = request.GetAsset<GameObject> ();
    if (prefab != null)
        GameObject.Instantiate(prefab);
}

AssetBundle Manager 將異步處理加載,並返回一個加載請求,我們需要通過調用 yield return StartCoroutine(request) 來加載 AssetBundle。之后,我們就可以調用 GetAsset () 方法來從 AssetBundle 中加載游戲對象。

加載場景(Scenes)

如果你的 AssetBundle 是一個場景,那么加載的代碼會有些不同。使用方法基本是相同的,只有細微的區別。如下:

IEnumerator InitializeLevelAsync (string levelName, bool isAdditive)
{
    // Load level from assetBundle.
    AssetBundleLoadOperation request = AssetBundleManager.LoadLevelAsync(sceneAssetBundle, levelName, isAdditive);
    if (request == null)
        yield break;
    yield return StartCoroutine(request);
}

正如你看到的,AssetBundle Manager 同樣是異步處理加載,LoadLevelAsync 方法返回一個加載請求,我們需要將請求傳入 StartCoroutine 方法來加載場景。

加載版本變量(Variants)

加載版本變量和加載場景、資源沒什么實際上的不同。我們只需要設置一下 AssetBundleManagerActiveVariants 屬性即可。

ActiveVariants 屬性是一個字符串數組。簡單地創建一個包含版本變量名稱的數組即可(版本變量名稱是你自己分配給資源的)。如下:

IEnumerator InitializeLevelAsync (string levelName, bool isAdditive, string[] variants)
{
    //Set the activeVariants.
    AssetBundleManager.ActiveVariants = variants;
    // Load level from assetBundle.
    AssetBundleLoadOperation request = AssetBundleManager.LoadLevelAsync(variantSceneAssetBundle, levelName, isAdditive);
    if (request == null)
        yield break;
    yield return StartCoroutine(request);
}

傳入一個你在代碼的其他地方創建的字符串數組(可能來自按鍵點擊,或者其他情況)。如果版本變量是有效的,這段代碼將加載和版本變量一致的 AssetBundles。

如果本文對你有幫助的話,點個贊或者評論一下吧!

下一章:【Unity3D技術文檔翻譯】第1.7篇 AssetBundles 補丁更新


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM