AssetBundle詳解

      學習一下AssetBundle相關的知識。

  • 打包

      關於Assetbundle相關的API,可以參考Unity的官方文檔(點擊這裏) 。關於打包的API,官方使用的是BuildPipeline類中的BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform)方法。該方法的第一個參數是輸出路徑,第二個參數是打包選項,一般選擇UncompressedAssetBundle(不壓縮數據)即可,第三個參數是打包平臺,win平臺是StandaloneWindows,安卓平臺就是Android等等。在編輯器下面撰寫腳本,調用該API即可。

  • 打包出的資源

       打包出來的每個資源都會附帶一個manifest文件,該文件記錄了資源的所有依賴資源的信息和資源的信息。同時,會爲當前的目錄生成一個assetbundle資源和對應的manifest文件,這個manifest文件中記錄則是該文件夾下面所有資源,及其依賴的信息。

如下圖

  • 從本地加載AssetBundle資源

        加載本地的資源和加載服務端的資源所使用的API有些許的不同。這裏主要使用兩個API。第一個就是LoadFromFile方法,這是從本地中加載AssetBundle的方法,其接受的參數是AssetBundle的路徑。然後再用LoadAsset方法從AssetBundle中加載資源,其參數是需要加載的資源的名字(實際名字,非assetbundle標籤名,並且名字不分大小寫)。另外,該方法有一個泛型參數,可以用於指定資源的類型。還有一個方法是LoadAllAssets,這個可以直接加載該指定AssetBundle中的所有資源,返回一個Object數組。這裏的同一個AssetBundle資源指的是assetbundle標籤名相同的資源,這樣的資源會打成同一分bundle資源,但是內部的資源卻是不止一份。

       加載資源的時候,如果資源的依賴資源是分開打包的,那麼,依賴資源也必須被加載出來,否者會出現材質丟失的情況。依賴資源是保存在資源對應的manifest中的,另外,還有一份保存在資源文件夾的manifest中的。可以使用這個總的資源列表文件來加載對應資源的依賴資源。我也曾嘗試過使用資源對應的manifest文件來讀取依賴資源,不過發現,該manifest不能使用LoadFromFile方法加載出來,不知道是什麼原因。

  • 從內存中加載AssetBundle資源

       從內存加載使用的API是LoadFromFileAsync,該方法是異步的,當然也有同步方法,從本地加載的LoadFromFile也有異步方法。LoadFromFileAsync方法返回AssetBundleCreateRequest類型,其屬性assetBundle就是所需要的AssetBundle資源。該方法是異步的,所以要使用協程來運行。

  • 從服務端下載AssetBundle資源

       從服務器上下載使用的是WebRequest 方法,不過該方法只在Unity5.3及以上版本中使用。之前的可以使用WWW.LoadFromCacheOrDownload來下載。使用WebRequest下載,分爲兩步,先使用UnityWebRequestAssetBundle類中的GetAssetBundle方法,該方法返回一個UnityWebRequest對象,使用Send方法請求下載,然後使用DownloadHandlerAssetBundle.GetContent方法接受UnityWebRequest對象,返回AssetBundle資源。

資源。

同樣的,也可以直接從UnityWebRequest對象中獲取AssetBundle對象,具體方法如下,獲取下載器對象downloadHandler,通過下載器對象的屬性來獲取Bundle資源:

具體方法是:

對於下載的數據,可以使用下載器的data屬性來獲取字節數組,然後進行寫入保存。

  • 卸載資源

       卸載資源可是使用AssetBundle類的成員方法Unload()。 當參數爲false時,表示卸載包中沒有被使用的資源(包中有多個資源,有些在使用,有些沒有被使用)。這種情況下,如果包體重新被加載後,則包體和原先沒有被刪除的資源沒有任何關聯了,就會出現某些資源會在內存中存在兩份的情況(一份之前卸載的包體加載出來的,一份包體重新加載出來的)。相應的,參數爲true時,表示將整個資源卸載,這種情況下,如果沒有確認所以資源是否不再被使用時,有可能造成資源丟失。

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