AssetBundle工作流與分配策略

AssetBundle工作流程

將資產分配給AssetBundles
要將給定資產分配給AssetBundle,請按照下列步驟操作:

  1. 從項目視圖中選擇要分配給捆綁包的資產
  2. 檢查檢查器中的對象
  3. 在檢查器的底部,您應該看到一個分配AssetBundles和Variants的部分:
  4. 左側下拉分配AssetBundle,而右側下拉分配變量
  5. 單擊左側下拉列表,顯示“無”,以顯示當前已註冊的AssetBundle名稱
  6. 單擊“新建…”以創建新的AssetBundle
  7. 輸入所需的AssetBundle名稱。請注意,AssetBundle名稱確實支持一種文件夾結構,具體取決於您鍵入的內容。要添加子文件夾,請用“/”分隔文件夾名稱。例如:AssetBundle名稱“environment / forest”將在環境子文件夾下創建名爲forest的包
  8. 一旦選擇或創建了AssetBundle名稱,您可以重複此過程以右手下拉以分配或創建變體名稱(如果需要),構建AssetBundle不需要變體名稱。

添加打包工具欄

using UnityEditor;
using System.IO;

public class CreateAssetBundles
{
    [MenuItem("Assets/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        string assetBundleDirectory = "Assets/AssetBundles";
        if(!Directory.Exists(assetBundleDirectory))
        {
            Directory.CreateDirectory(assetBundleDirectory);
        }
		BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
    }
}

這樣就會有一個打包工具,如果不是WIN平臺,自行更改BuildTarget。

那如何加載

打算從本地存儲加載:

public class LoadFromFileExample extends MonoBehaviour {
    function Start() {
        var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "myassetBundle"));
        if (myLoadedAssetBundle == null) {
            Debug.Log("Failed to load AssetBundle!");
            return;
        }
        var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("MyObject");
        Instantiate(prefab);
    }
}

自己託管AssetBundles並需要將它們下載到遊戲中

IEnumerator InstantiateObject()
    {
        string url = "file:///" + Application.dataPath + "/AssetBundles/" + assetBundleName;        
        UnityEngine.__Networking__.UnityWebRequest request = UnityEngine.__Networking__.UnityWebRequest.GetAssetBundle(url, 0);
        yield return request.Send();
        AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
        GameObject cube = bundle.LoadAsset<GameObject>("Cube");
        GameObject sprite = bundle.LoadAsset<GameObject>("Sprite");
        Instantiate(cube);
        Instantiate(sprite);
    }

GetAssetBundle(string, int)獲取AssetBundle的位置的URL以及要下載的包的版本。
在此示例中,我們仍然指向本地文件,但string url可以指向您擁有AssetBundles的任何URL。
UnityWebRequest有一個特定的句柄來處理AssetBundles
DownloadHandlerAssetBundle,它從請求中獲取AssetBundle。

分配策略

三種大的分配策略:

  • 邏輯實體分組:

    根據資源所代表的項目功能部分分配,比如資源屬於用戶界面,角色,環境等,這樣來分配。
    意思就是在根據遊戲中的邏輯上的實體來分配,比如屬於角色的所有東西都打在角色的包裏面
    邏輯實體分組特別適用於可下載內容(DLC),比如這個DLC只是更改了一些場景景物,那麼我們只需要更改我們的場景模型包,而玩家也只需要下載這個更改後的包。
    但是我的想法是另外一種:
    比如在場景修改某個物體或者添加了一些新的下載內容後,我們只需要將這些修改後的或者新的內容打入新的AB包就可以只下載新的AB包。在玩家擁有DLC時,加載新的AB包就可以了。如果沒有DLC那麼就只加載舊的包,這樣的缺點也很明顯,就是所有的東西都被雜糅到了新包裏面。更好的方式是依舊按照之前的方式分類,新的角色模型打入一個新包,新的場景打入另一個新包,這樣玩家既可以不用下載之前的內容,又可以很好地分類。

  • 類型分組:
    將相似的資源分配到一個包,比如音頻在一個包,動畫在一個包,模型在一個包等

  • 併發內容分組:
    將需要同時加載和使用的資源捆綁在一起,這種方式就是基於關卡的,比如這個關卡有一些特殊的東西,而其他關卡都沒有的,那麼就把這些特殊的東西打在一起。

遵循原則

  • 將頻繁更新的對象拆分爲AssetBundle,與很少更改的對象分開
  • 對可能同時加載的對象進行分 組。例如模型,紋理和動畫。
  • 如果您注意到多個AssetBundle中的多個對象依賴於來自完全不同的AssetBundle的單個資產,請將依賴項移動到單獨的AssetBundle。如果多個AssetBundle引用其他AssetBundle中的同一組資產,則可能值得將這些依賴項拉入共享AssetBundle以減少重複。
  • 如果不可能同時加載兩組對象,例如標準和高清屬性,請確保它們位於自己的AssetBundle中。
  • 如果同時經常加載50%的捆綁包,請考慮拆分AssetBundle。
  • 考慮組合小型(少於5到10個資產)但其內容經常同時加載的AssetBundle。
  • 如果一組對象只是同一對象的不同版本,請考慮AssetBundle Variants。

本文部分內容引用字Unity官方文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章