Unity5的AssetBundle的一點使用心得

2022-06-22 02:00:14 字數 3025 閱讀 2191

如果你覺得自己對assetbundle不熟悉,建議先看看另外一篇文章:

先來說說關於舊版本的assetbundle的事情。

在載入的時候,由於我們是預先記錄了各個資源的依賴關係,所以在載入某乙個資源的時候,先去儲存的檔案裡面查詢它的依賴關係,把所有用到的依賴資源都先載入一次,然後再載入它,就能完整的載入出乙個想要的模型之類了。

這就是完整的舊版本assetbundle依賴打包和載入的流程了。不過由於是受人指導學會的,所以不方便把全部**貼出來。

再來看看5.0版本的心assetbundle的使用情況:

看到新版本的assetbundle,我那位同事估計會一口老血噴在螢幕上面。那是因為,這個辛辛苦苦做出來的打包策略,unity已經整合了。

新版本的assetbundle在打包的時候多了乙個叫做buildpipeline.buildassetbundles(outputpath)的方法,然後每乙個資源可以設定乙個assetbundlename。只要你呼叫這個方法,那麼所有已經設定過assetbundlename的資源,就會自動打包,具體的好處有:

1、可以直接在編輯器ui上設定操作

2、提供了更簡便的指令碼api

3、unity本身會處理所有的依賴關係

4、生成了一種叫做manifest的檔案,用於記錄資源之間的依賴關係,並以鏈式結構記錄,修改時只需修改鏈的其中一環

5、增量打包功能。

以上的好處,是官方說明的,我大概操作了一下,說的都是事實,只是使用時有點需要注意的地方。

很明顯的看出,這些優點,正是我那位同事已經做過的事情,和一些暫時沒有做到的事情。

先來說說最多人關心的問題,unity自己處理依賴關係。

實際上來說,所有需要打包成assetbundle的資源,你是要先賦予它乙個assetbundlename的,在它有了assetbundlename之後,實際上它的資訊已經存在於assetdatabase裡面了。所以在打包的時候,只需要呼叫buildpipeline.buildassetbundles方法,它會把記錄了的在assetdatabase裡面的所有資源先計算出依賴關係,再拆分打包。這個步驟是一點問題都沒有的。要注意的是,你所有依賴的資源都必須賦予assetbundlename,不然,依賴就不會被拆分。

在載入的時候,assetbundle的特性是和舊版本一樣的,就是當乙個目標資源的依賴資源已經存在與記憶體中(也就是已經被載入過了),那麼在載入目標資源的時候,unity會自動的幫你找到依賴關係。所以在載入的時候實際上還是要你手動載入依賴資源的。這一點和舊版本一樣。

再來說說打包工具的編寫。

雖然官方說得很美好,一句buildpipeline.buildassetbundles(outputpath)就可以直接把所有資源都打包了,而需要打包的資源可以在編輯器介面直接輸入。但實際上由於上面說到的必須賦予每乙個依賴資源assetbundlename,你不可能每乙個資源去手動的查詢用到的依賴資源再在編輯器輸入名字,所以舊版本的打包流程還是要的。

首先,你可以遍歷需要打包的資料夾,把所有需要打包的預設或者資源都找到,然後設定assetbundlename,然後,通過assetdatabase.getdependencies方法逐個找到資源的依賴資源路徑,用assetdatabase.assetpathtoguid算出每個資源的唯一id,然後將唯一id當做assetbundlename賦予給每個依賴資源。最後,呼叫buildpipeline.buildassetbundles(outputpath)打包到指定位置。

最後說說載入。

由於依賴關係都存在於manifest中,所以在載入資源之前,要先載入manifest檔案。

實際上在打包的時候,會有乙個總的manifest檔案,叫做assetbundle.manifest,然後每乙個小的資源分別有乙個自己的manifest檔案。在我們載入的時候,需要先把總的assetbundle載入進來。

比如這樣:

string murl = cdn + "assetbundle";

www mwww = www.loadfromcacheordownload(murl, 0);

yield return mwww;

if (!string.isnullorempty(mwww.error))

else

其中realname是想載入的assetbundle的名字,需要帶副檔名。

通過了這一步,所有的依賴資源都載入完了,可以載入目標資源了:

www www = www.loadfromcacheordownload(url, mainfest.getassetbundlehash(realname+".ab"), 0);

yield return www;

if (!string.isnullorempty(www.error))

else

foreach (assetbundle ab in abs)

到這一步,所有的資源都載入完畢了。注意的是,記得unload,不然下次就加不進來了。或者不unload的話,就做乙個字典記錄所有載入過的assetbundle,還有它們的引用計數器。那樣就可以先判斷是否存在在載入。

以上就是unity5.0的assetbundle的使用方法了。下面來吐槽一下。

2、我在沒有使用之前,以為可以按照資料夾結構來打包,那樣的話,就可以簡單的從resources.load和外部www載入中做切換,只需要替換乙個cdn位址就可以了。但實際上unity把所有assetbundle都打包在了同乙個目錄,在這個轉換的過程中,我們還需要記錄一下兩者的對應關係。(其實這一點是錯誤的,assetname只要是帶「/」的,就能自動生成資料夾結構的,之後的文章都忘記提了,誤導了大家)

3、資源打包的策略有時候和專案的設計本身有關,如果是階段性很明確的資源管理,可能舊版的assetbundle打包也不錯。

4、現在只看了unity5的assetbundle覺得不錯,但又看了一下其他功能,發現unity5的很多功能都改了,這樣的大改動對於舊專案來說有可能是影響非常大的,是不是值得為了新的assetbundle而公升級unity,還是需要更多的評估。

Unity5的AssetBundle的一點使用心得

如果你覺得自己對assetbundle不熟悉,建議先看看另外一篇文章 先來說說關於舊版本的assetbundle的事情。在載入的時候,由於我們是預先記錄了各個資源的依賴關係,所以在載入某乙個資源的時候,先去儲存的檔案裡面查詢它的依賴關係,把所有用到的依賴資源都先載入一次,然後再載入它,就能完整的載入...

Unity5自動命名Assetbundle並打包

using unityengine using system.collections using unityeditor using system.io 把resource下的資源打包成.unity3d 到streamingassets目錄下 public class builder editor ...

Unity5自動命名Assetbundle並打包

using unityengine using system.collections using unityeditor using system.io 把resource下的資源打包成.unity3d 到streamingassets目錄下 public class builder editor ...