Unity5.4新版AssetBundle資源打包

(1)新版本 惟一打包API Buildpipeline.BuildAssetBundle算法

(2)在資源的Inpector界面最下方可設置該資源的assetbundleName,緩存

每一個assetbundleName對應一個Bundle,即assetbundleName相同的資源會打在一個Bundle中。服務器

(3),咱們還能夠在Inpector中設置另外一個名字,即variant(變體)。在打包時,variant會做爲後綴添加在assetbundleName以後。(差別區分,例如相同名字的Normal和HD的區別)異步

AssetBundleName,名字固定爲小寫,每一個AssetBundle均可以設置一個Variant,其實就是一個後綴,實際上AssetBundle會添加這個後綴。若是有不一樣分辨率的同名資源,可使用這個來區分。函數

值得注意的是:工具

      AssetBundleName是能夠帶’/’符號的,這是一個很好的設計,由於咱們打包的資源會不少,若是打包生成的全部AssetBundle都生成在同一個文件目錄裏,這確定是很難管理的。不過名稱引入’/’即可以很好解決這個問題。咱們經過名字中設置相似」npc/demon/jushiguai.unity3d」這樣的名字。那麼在生成AssetBundle的時候會自動根據名字生成文件目錄。這樣生成的AssetBundle有了分類就很好管理了。以下圖: 優化

關於Assetbundle 中的腳本,在移動平臺下Assetbundle裏面放的腳本是不會被執行的,咱們打包前給兩個Prefab掛上了腳本嗎?在手機上將Assetbundle下載到本地後,加載進遊戲中Prefab會自動在本地找它身上掛着的腳本,他是根據腳本的名來尋找,若是本地有這條腳本的話,Prefab會把這個腳本從新綁定在自身,而且會把打包前的參數傳遞進來。若是本地沒有,身上掛的條腳本永遠都不會被執行。ui

優化建議:加密

提供腳本批量對資源設置assetbundleName。url

規劃好assetBundle所對應的資源類型,規劃好assetBundle的數量。

Unity3D引擎爲咱們提供了三種壓縮策略來處理AssetBundle的壓縮,即:

LZMA格式

LZ4格式

不壓縮

LZMA格式:

在默認狀況下,打包生成的AssetBundle都會被壓縮。在U3D中,AssetBundle的標準壓縮格式即是LZMA(LZMA是一種序列化流文件),所以在默認狀況下,打出的AssetBundle包處於LZMA格式的壓縮狀態,在使用AssetBundle前須要先解壓縮。

使用LZMA格式壓縮的AssetBundle的包體積最小(高壓縮比),可是相應的會增長解壓縮時的時間。

LZ4格式:

Unity 5.3以後的版本增長了LZ4格式壓縮,因爲LZ4的壓縮比通常,所以通過壓縮後的AssetBundle包體的體積較大(該算法基於chunk)。可是,使用LZ4格式的好處在於解壓縮的時間相對要短。

若要使用LZ4格式壓縮,只須要在打包的時候開啓BuildAssetBundleOptions.ChunkBasedCompression便可。

代碼:

BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath, BuildAssetBundleOptions.ChunkBasedCompression); 

不壓縮:

固然,咱們也能夠不對AssetBundle進行壓縮。沒有通過壓縮的包體積最大,可是訪問速度最快。

若要使用不壓縮的策略,只須要在打包的時候開啓BuildAssetBundleOptions.UncompressedAssetBundle便可。

代碼:

BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath, BuildAssetBundleOptions.UncompressedAssetBundle);

加載:

運行時加載AssetBundle對象主要能夠分爲兩大類途徑:

先獲取WWW對象,再經過WWW.assetBundle獲取AssetBundle對象

直接獲取AssetBundle

下面咱們就具體分析一下這兩種途徑:

先獲取WWW對象,再經過WWW.assetBundle加載AssetBundle對象:

在先獲取WWW對象,在獲取AssetBundle的這種方式中,咱們可使用如下兩個API來實現這個功能。

public WWW(string url),直接調用WWW類的構造函數,目標AssetBundle所在的路徑做爲其參數,構造WWW對象的過程當中會加載Bundle文件並返回一個WWW對象,完成後會在內存中建立較大的WebStream(解壓後的內容,一般爲原Bundle文件的4~5倍大小,紋理資源比例可能更大),所以後續的AssetBundle.LoadAsset能夠直接在內存中進行。(不管是服務器路徑仍是本地路徑下載操做都同樣)可是bundle只能保存在內存中,也就是退出遊戲在進入還得從新下載:),顯然咱們實際開發中不會這樣用。

 public static WWW LoadFromCacheOrDownload(string url, int version, uint crc = 0),WWW類的一個靜態方法,調用該方法一樣會加載Bundle文件同時返回一個WWW對象,和上一個直接調用WWW的構造函數的區別在於該方法會將解壓形式的Bundle內容存入磁盤中做爲緩存(若是該Bundle已在緩存中,則省去這一步),完成後只會在內存中建立較小的SerializedFile,然後續的AssetBundle.LoadAsset須要經過IO從磁盤中的緩存獲取。

直接加載AssetBundle對象:

在4.x時代,咱們能夠經過CreateFromFile或CreateFromMemory方法將磁盤上的文件或內存中的流構形成咱們須要的AssetBundle對象。可是在5.x版本中,曾經的這兩個方法已經被新的LoadFromFile、LoadFromMemory方法所代替(這兩個方法還有異步的版本),且機制上也有了一些區別。

public static AssetBundle LoadFromFile(string path, uint crc = 0):新的從文件建立加載AssetBundle方法和4.x中的CreateFromFile方法在機制上有了一些分別,舊的CreateFromFile必須使用未壓縮的Bundle文件才能在運行時動態建立AssetBundle對象。而新的LoadFromFile方法則沒有這個要求,它支持上一節中提到的幾個壓縮格式,針對LZ壓縮格式和未壓縮的磁盤上的bundle文件,該方法會直接加載。針對使用默認的LZMA壓縮格式壓縮的bundle文件,該方法會在幕後先將bundle文件解壓後再加載。這是最快的加載AssetBundle的方式。該方法是同步版本,還有異步版本:LoadFromFileAsync。

public static AssetBundle LoadFromMemory(byte[] binary, uint crc = 0):從內存中獲取Bundle的二進制數據,同步地建立AssetBundle對象。該方法通常用在通過加密的數據上,通過加密的流數據通過解密以後咱們能夠調用該方法動態的建立AssetBundle對象。該方法是同步版本,還有異步版本:LoadFromMemoryAsync。

實際使用環境的分析:

(1) 隨遊戲一同發佈的AssetBundle(通常位於StreamingAssets文件夾中):

在打AssetBundle包時,使用LZ4壓縮格式進行打包(開啓BuildAssetBundleOptions.ChunkBasedCompression便可)。

在運行時須要加載AssetBundle對象時,使用LoadFromFile方法進行加載。

這樣作的好處是:便可以將AssetBundle文件壓縮,又能夠兼顧加載速度,且節約內存。

(2) 做爲更新包,須要從服務端下載的AssetBundle:

在打AssetBundle包時,使用默認的LZMA格式壓縮。

使用WWW.LoadFromCacheOrDownload方法下載並緩存AssetBundle包文件。

這樣作的好處是:得到了最大的壓縮率,在下載過程當中能夠減小數據傳輸量。同時,在本地磁盤建立緩存以後,又能夠兼顧以後的加載速度,且節約內存。

(3) 進行加密的AssetBundle:

在打AssetBundle包時,使用LZ4壓縮格式進行打包(開啓BuildAssetBundleOptions.ChunkBasedCompression便可)。

在運行時須要加載AssetBundle對象時,使用LoadFromMemory方法進行加載。(這也是從內存中使用流數據加載AssetBundle對象的僅有的使用場景。) 

(4)須要本身壓縮的AssetBundle:

咱們本身也可使用第三方庫或工具對生成的AssetBundle包文件進行壓縮,若是須要這樣作,則咱們最好不要再使用Unity3D對AssetBundle進行壓縮,所以在打包時選擇開啓BuildAssetBundleOptions.UncompressedAssetBundle。

在運行時須要加載AssetBundle對象時,使用LoadFromFileAsync方法進行異步加載。

資源加載:

新版的AssetBundle中,加載資源的API已經變成了如下的幾個:

LoadAsset:從資源包中加載指定的資源

LoadAllAsset:加載當前資源包中全部的資源

LoadAssetAsync:從資源包中異步加載資源

卸載資源:

資源卸載部分的變化不大,使用的仍然是Unload方法。

Unload()

該方法會卸載運行時內存中包含在bundle中的全部資源。

當傳入的參數爲true,則不只僅內存中的AssetBundle對象包含的資源會被銷燬。根據這些資源實例化而來的遊戲內的對象也會銷燬。

當傳入的參數爲false,則僅僅銷燬內存中的AssetBundle對象包含的資源。

其餘:

新增打包模式

ForceRebuildAssetBundle             : 強制從新打包全部AssetBundle文件,通常狀況只作增量打包。

IgnoreTypeTreeChanges              : 用於判斷AssetBundle更新時,是否忽略TypeTree的變化。

AppendHashToAssetBundleName : 將Hash值添加在AB包文件名以後,開啓後可經過文件名來判斷哪些AB進行了更新。

依賴項相關:

雖然Unity說會幫咱們處理好依賴關係,可是隻是說可以方便獲取一個asset的依賴項,並不會幫你自動加載全部依賴項。因此咱們加載的代碼仍是三個部分:加載依賴項和加載自身,卸載依賴項。

Dependencies(資源依賴關係):當某個資源依賴其它AB 包中的文件時候,manifes(清單)文件中顯示依賴關係。

相關文章
相關標籤/搜索