構(gòu)建AssetBundles
在AssetBundle工作流程的文檔中,我們有一個(gè)示例代碼蜀漆,它將三個(gè)參數(shù)傳遞給BuildPipeline.BuildAssetBundles
函數(shù)诱贿。讓我們更深入地了解我們實(shí)際上在說(shuō)什么莫瞬。
Assets/AssetBundles:這是AssetBundles將被輸出到的目錄逼争。您可以將其更改為所需的任何輸出目錄熄驼,只需在嘗試構(gòu)建之前確保文件夾實(shí)際存在。
BuildAssetBundleOptions
有多種不同的BuildAssetBundleOptions
選項(xiàng)可以選擇烘豹。相關(guān)的各個(gè)選項(xiàng)可以參閱腳本API文檔中的關(guān)于BuildAssetBundleOptions的內(nèi)容瓜贾。
雖然隨著需求的變化和增加,您可以自由組合BuildAssetBundleOptions
選項(xiàng)携悯,但有三個(gè)特定的BuildAssetBundleOptions
是用來(lái)處理AssetBundle壓縮:
- BuildAssetBundleOptions.None:此bundle選項(xiàng)使用LZMA格式壓縮祭芦,這種壓縮是序列化的數(shù)據(jù)文件的單一壓縮的LZMA流。 LZMA壓縮的文件在使用前需要對(duì)整個(gè)bundle解壓縮憔鬼。這導(dǎo)致最小的文件大小和由于解壓縮而稍微增加的加載時(shí)間龟劲。值得注意的是,當(dāng)使用此
BuildAssetBundleOptions
時(shí)轴或,為了使用捆綁包中的任何資源昌跌,必須首先解壓縮整個(gè)捆綁包。一旦bundle解壓縮后照雁,將使用LZ4在磁盤上重新壓縮蚕愤,LZ4壓縮在使用bundle中的資產(chǎn)時(shí),不需要提前對(duì)整個(gè)bundle進(jìn)行解壓縮。這最適合用于bundle中的資產(chǎn)萍诱,以便從bundle中使用一個(gè)資產(chǎn)將意味著所有資產(chǎn)將被加載悬嗓。打包角色或場(chǎng)景的所有資源都是可能使用的捆綁包的一些示例。由于較小的初始文件大小裕坊,利用LZMA壓縮僅推薦用于從異地主機(jī)下載資源包包竹。一旦文件被下載,它會(huì)緩存為lz4壓縮包籍凝。 -
BuildAssetBundleOptions.UncompressedAssetBundle
: 此bundle選項(xiàng)以數(shù)據(jù)完全未壓縮的方式構(gòu)建bundle周瞎。未壓縮的缺點(diǎn)是較大的文件下載大小。但是静浴,一旦下載的加載時(shí)間會(huì)更快堰氓。 -
BuildAssetBundleOptions.ChunkBasedCompression
: 此bundle選項(xiàng)使用稱為L(zhǎng)Z4的壓縮方法,這導(dǎo)致比LZMA更大的壓縮文件大小苹享,但不像LZMA那樣在使用之前不需要整個(gè)捆綁包解壓縮双絮。 LZ4使用基于塊的算法,允許將AssetBundle以切片(pieces)或“塊”(chunks)的形式加載得问。解壓縮單個(gè)塊允許使用包含的資產(chǎn)囤攀,即使AssetBundle的其他塊未被解壓縮。
使用ChunkBasedCompression與未壓縮的bundle具有可比較的加載時(shí)間宫纬,還具有減小磁盤大小的附加優(yōu)勢(shì)焚挠。
BuildTarget
BuildTarget.Standalone
: 在這里,我們正在告訴構(gòu)建管道漓骚,我們將使用這些AssetBundles的目標(biāo)平臺(tái)蝌衔。
您可以在BuildTarget的API的腳本參考文檔中找到可用的顯式構(gòu)建目標(biāo)的列表。但是蝌蹂,如果您不希望在構(gòu)建目標(biāo)中進(jìn)行硬編碼噩斟,則可以隨時(shí)利用EditorUserBuildSettings.activeBuildTarget,這將自動(dòng)找到你目前的設(shè)置構(gòu)建和構(gòu)建AssetBundles基于的目標(biāo) 平臺(tái)孤个。
一旦正確設(shè)置了構(gòu)建腳本剃允,就可以構(gòu)建bundles了。如果您按照上述腳本示例齐鲤,請(qǐng)單擊Assets > Build AssetBundles以啟動(dòng)該過(guò)程斥废。
現(xiàn)在你已經(jīng)成功構(gòu)建了AssetBundles,你可能會(huì)注意到你的AssetBundles目錄有可能比你預(yù)期更多的文件给郊。確切地說(shuō)牡肉,是2 *(n + 1)個(gè)文件。讓我們花一點(diǎn)時(shí)間來(lái)看看BuildPipeline.BuildAssetBundles
的產(chǎn)量丑罪。
對(duì)于你在編輯器中指定的每個(gè)AssetBundle荚板,你將注意到一個(gè)包含AssetBundle name
和AssetBundle name +.manifest
的文件凤壁。
將會(huì)有一個(gè)額外的bundle和manifest,它不會(huì)與您創(chuàng)建的任何AssetBundle共享一個(gè)名稱跪另。而是以它位于的目錄(AssetBundles構(gòu)建到的目錄)命名拧抖。這是Manifest Bundle。我們將在以后討論更多的內(nèi)容以及如何使用它免绿。
The AssetBundle File
這是缺少.manifest擴(kuò)展名的文件唧席,以及你在運(yùn)行時(shí)加載的內(nèi)容,以加載你的資產(chǎn)嘲驾。
AssetBundle文件是一個(gè)在內(nèi)部包含多個(gè)文件的存檔淌哟。此存檔的結(jié)構(gòu)可能會(huì)稍有變化,具體取決于它是AssetBundle還是場(chǎng)景AssetBundle辽故。這是一個(gè)正常的AssetBundle的結(jié)構(gòu):
場(chǎng)景AssetBundle更改自標(biāo)準(zhǔn)的AssetBundles徒仓,因?yàn)樗槍?duì)場(chǎng)景及其內(nèi)容的流加載進(jìn)行了優(yōu)化。該圖像顯示場(chǎng)景bundle的內(nèi)部結(jié)構(gòu):
The Manifest File
對(duì)于生成的每個(gè)包誊垢,包括附加的清單包掉弛,都會(huì)生成關(guān)聯(lián)的清單文件。清單文件可以使用任何文本編輯器打開喂走,并且包含諸如循環(huán)冗余校驗(yàn)(CRC)數(shù)據(jù)和包的依賴性數(shù)據(jù)的信息殃饿。對(duì)于正常的AssetBundles,他們的清單文件將如下所示:
ManifestFileVersion: 0
CRC: 2422268106
Hashes:
AssetFileHash:
serializedVersion: 2
Hash: 8b6db55a2344f068cf8a9be0a662ba15
TypeTreeHash:
serializedVersion: 2
Hash: 37ad974993dbaa77485dd2a0c38f347a
HashAppended: 0
ClassTypes:
- Class: 91
Script: {instanceID: 0}
Assets:
Asset_0: Assets/Mecanim/StateMachine.controller
Dependencies: {}
Which shows the contained assets, dependencies, and other information.
The Manifest Bundle that was generated will have a manifest, but it’ll look more like this:
ManifestFileVersion: 0
AssetBundleManifest:
AssetBundleInfos:
Info_0:
Name: scene1assetbundle
Dependencies: {}
這將顯示AssetBundles如何關(guān)聯(lián)以及它們的依賴關(guān)系∮蟪Γ現(xiàn)在乎芳,只要明白這個(gè)bundle包含了AssetBundleManifest對(duì)象,這對(duì)于找出在運(yùn)行時(shí)加載哪個(gè)bundle依賴是非常有用的帖池。要了解有關(guān)如何使用此bundle和manifest對(duì)象的更多信息奈惑,請(qǐng)參閱使用本地AssetBundles的文檔。
原文鏈接:
Building AssetBundles
同系列文章
本文作者: Sheh偉偉
本文鏈接: http://davidsheh.github.io/2017/08/21/「翻譯」Unity中的AssetBundle詳解(三)/
版權(quán)聲明: 本博客所有文章除特別聲明外睡汹,均采用 CC BY-NC-SA 3.0 許可協(xié)議携取。轉(zhuǎn)載請(qǐng)注明出處!