天天看點

「翻譯」Unity中的AssetBundle詳解(一)

AssetBundles

AssetBundle是一個存檔檔案,其中包含平台在運作時加載的特定資産(模型,紋理,預制,音頻剪輯,甚至整個場景)。AssetBundles可以表示彼此之間的依賴關系;例如AssetBundle A中的一個材質可以引用AssetBundle B中的一個紋理。為了通過網絡進行有效的傳遞,可以根據用例要求,選擇内置算法(LZMA和LZ4)來對AssetBundles進行壓縮。

AssetBundles可用于可下載下傳内容(DLC),減少初始安裝大小,加載為最終使用者平台優化的資産,并降低運作時記憶體壓力。

一個AssetBundle檔案中有什麼?

好的問題,實際上“AssetBundle”可以指兩個不同但有關的事情。

第一個是磁盤上的實際檔案。我們把這叫做AssetBundle存檔,或在本文檔隻是短期檔案。存檔可以被認為是一個容器,就像一個檔案夾,在其中儲存其他檔案。這些附加檔案包括兩種類型:序列化檔案和資源檔案。序列化的檔案将您的資産分成各自的對象,并寫入這個檔案。資源檔案隻是存儲在某些資産(紋理和音頻)中的二進制資料塊,允許我們在另一個線程上有效地将其從磁盤加載到記憶體。

第二個是您通過代碼從特定存檔加載資源的實際的AssetBundle對象。此對象包含您添加到此存檔的資源的所有檔案路徑的映射到屬于該資産的對象,該對象在需要時需要加載。(This object contains a map of all the file paths of the assets you added to this archive to the objects that belong to that asset that need to be loaded when you ask for it.)

AssetBundle工作流程

要開始使用AssetBundles,請按照下列步驟操作。有關每個工作流程的更詳細資訊,請參見本部分文檔中的其他頁面。

将資産配置設定給AssetBundles

要将一個給定的資産配置設定給一個AssetBundle,請按照下列步驟操作:

  1. 從“項目視圖”中選中要配置設定給一個bundle的資産
  2. 檢查Inspector視圖中的對象
  3. 在Inspector視圖的底部,可以看到一個部分來配置設定AssetBundles和Variants
  4. 左側的下拉菜單配置設定AssetBundle,而右側的下拉菜單則指定Variants
  5. 點選左側的下拉菜單,其中顯示“None”以顯示目前注冊的AssetBundle名稱
  6. 如果尚未建立,你将看到上面的圖像中的清單
  7. 點選“New...”建立一個新的AssetBundle
  8. 鍵入所需的AssetBundle名稱。請注意,AssetBundle名稱支援一種類型的檔案夾結構,具體取決于你鍵入的内容。要添加子檔案夾,請使用“/”分隔檔案夾名稱。例如:AssetBundle名稱“environment/forest”将在environment子檔案夾下建立一個名為forest的bundle
  9. 一旦你選擇或建立了一個AssetBundle名稱,你可以重複此過程,為右側下拉菜單配置設定或建立一個不同的名稱,以配置設定或建立一個Variant名稱,如果你願意的話。在建構AssetBundles時,Variant名稱不是必需的。

要了解有關AssetBundle配置設定和随附政策的更多資訊,請參閱Preparing Assets for AssetBundles的文檔。

建構AssetBundles

在項目中的Assets檔案夾下建立一個名為Editor的檔案夾,并在檔案夾中放置以下内容的腳本:

using UnityEditor;

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.Standalone);
    }
}
           

該腳本将在Assets菜單的底部建立一個名為“Build AssetBundles”的菜單項,該菜單項将執行與該标記關聯的功能中的代碼。當您單擊Build AssetBundles時,進度條将顯示一個建構對話框。這将使那些用AssetBundle名稱标記的所有資産打包進同一個檔案,并将它們放在由assetBundleDirectory定義的路徑上的檔案夾中。

有關此代碼正在執行的更多詳細資訊,請參閱有關Building AssetBundles的文檔。

上傳AssetBundles到非本地存儲

這一步對于每個使用者都是獨一無二的,而不是一步一步可以告訴你如何做。如果您打算将AssetBundles上傳到第三方托管網站,請在此處進行。如果您正在嚴格執行本地開發,并打算将所有AssetBundles都放在磁盤上,請跳到下一步。

加載AssetBundles和Assets

對于有意從本地存儲加載的使用者,您将對AssetBundles.LoadFromFile API感興趣。看起來像這樣:

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);
    }
}
           

LoadFromFile

擷取封包件的路徑。

如果您自己托管AssetBundles并且需要将其下載下傳到遊戲中,那麼您将對UnityWebRequest API感興趣。這裡有一個例子:

IEnumerator InstantiateObject()
{
    string uri = "file:///" + Application.dataPath + "/AssetBundles/" + assetBundleName;
    UnityEngine.Networking.UnityWebRequest request = UnityEngine.Networking.UnityWebRequest.GetAssetBundle(uri, 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的位置的uri以及要下載下傳的包的版本。在這個例子中,我們仍然指向一個本地檔案,但是字元串uri可以指向你托管AssetBundles的任何URL。

UnityWebRequest具有處理AssetBundles的特定句柄(DownloadHandlerAssetBundle),DownloadHandlerAssetBundle從請求中擷取AssetBundle。

無論使用的方法如何,你現在都可以通路AssetBundle對象。從該對象中加載資源,你将需要使用

LoadAsset<T>(string)

方法,該方法中泛型類型T表示你所要加載的Asset的類型,方法參數為所要加載的Asset對象的名稱。這将傳回您從AssetBundle加載的任何對象。您可以像Unity中的任何對象一樣使用這些傳回的對象。例如,如果要在場景中建立一個GameObject,則隻需要調用Instantiate(gameObjectFromAssetBundle)。

有關加載AssetBundles的API的更多資訊,請參閱Using AssetBundles Natively文檔。

原文連結:
  1. AssetBundle Workflow

同系列文章

「翻譯」Unity中的AssetBundle詳解(一)

「翻譯」Unity中的AssetBundle詳解(二)

「翻譯」Unity中的AssetBundle詳解(三)

「翻譯」Unity中的AssetBundle詳解(四)

本文作者: Sheh偉偉

本文連結: http://davidsheh.github.io/2017/07/14/「翻譯」Unity中的AssetBundle詳解(一)/

版權聲明: 本部落格所有文章除特别聲明外,均采用 CC BY-NC-SA 3.0 許可協定。轉載請注明出處!

作者:Sheh偉偉

出處:http://www.cnblogs.com/davidsheh/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利.

繼續閱讀