unity3d在5.0之后打包Assetbundle變得比之前簡(jiǎn)單多了,最簡(jiǎn)單的辦法就是把所有資源都標(biāo)記Assetbundle的Flag,然后直接調(diào)用unity3d的打包Assetbundle即可,詳情可參見(jiàn)官方文檔蒸眠。
通過(guò)標(biāo)記打包方式的優(yōu)缺點(diǎn)
這種打包方式的優(yōu)點(diǎn)在于簡(jiǎn)單,缺點(diǎn)在于不好管理需要需要打包的資源钻洒。舉例來(lái)說(shuō)就是你必須把所有需要打包的資源都標(biāo)記上Assetbundle的Flag,(包括prefab,texture,material,fbx,animation等),最后容易把資源打得特別散,造成每一個(gè)文件都是一個(gè)assetbundle。這樣其實(shí)對(duì)于加載是特別不友好的挂滓,每一個(gè)assetbundle的引用都至少會(huì)有大約4kb的內(nèi)存。如果不這樣做啸胧,只對(duì)prefab做標(biāo)記的話赶站,容易造成資源的重復(fù)打包,一些texture纺念,fbx可能會(huì)多次打進(jìn)不同的assetbundle里贝椿。
通過(guò)buildmap方式打包的優(yōu)缺點(diǎn)
unity還提供了一種buildmap的打包方式,可以自己管理需要打包的資源陷谱,優(yōu)點(diǎn)在于自己管理依賴關(guān)系烙博,可以最大程度的控制打包粒度,缺點(diǎn)就是需要寫(xiě)點(diǎn)代碼烟逊,大約500行渣窜。
使用buildmap打包的流程
1.目錄管理
管理好你的資源目錄,把需要單獨(dú)打包和不需要單獨(dú)打包的文件放在不同的目錄下宪躯,默認(rèn)需要單獨(dú)打包的只有預(yù)制件目錄图毕,其他的目錄一般可以根據(jù)依賴自動(dòng)打進(jìn)包里,可以參考下面的目錄結(jié)構(gòu):
Assets
|--Prefabs
|--a.prefab
|--b.prefab
|--Textures
|--a.tex
|--b.tex
|--c.tex
|--Materials
|--Aniamations
|--Models
|--Other
我們打包前會(huì)遍歷Prefabs目錄眷唉,得到每一個(gè)prefab的依賴予颤,構(gòu)建一棵依賴樹(shù)囤官,根據(jù)依賴樹(shù)進(jìn)行打包。
2.構(gòu)建依賴樹(shù)
unity3d提供了 AssetDatabase.GetDependencies
的方法來(lái)獲取一個(gè)文件的依賴關(guān)系蛤虐,我們假設(shè)遍歷完預(yù)制件文件夾后得到的依賴關(guān)系如下:
a.prefab依賴于a.mat,a.fbx,common.animator;
b.prefab依賴于b.mat,b.fbx,common.animator;
a.mat依賴于a.tex,b.tex
b.mat依賴于b.tex,c.tex,d.tex
最終形成的依賴關(guān)系樹(shù)如下:
注意:unity提供了獲取預(yù)制件的直接依賴和所有依賴(包括間接依賴)党饮,構(gòu)建依賴樹(shù)時(shí)需要獲取預(yù)制件的直接依賴,再依次獲取每一個(gè)依賴文件的直接依賴驳庭,直到獲取到最底層的依賴刑顺,由此構(gòu)建出所有預(yù)制件形成的依賴樹(shù)。
3.根據(jù)依賴樹(shù)打包Assetbundle
- 如果樹(shù)的一個(gè)節(jié)點(diǎn)有2個(gè)或以上的父節(jié)點(diǎn)饲常,則該資源被2個(gè)或多個(gè)其他資源所依賴蹲堂,該節(jié)點(diǎn)需要打包成獨(dú)立的Assetbundle。
- 如果樹(shù)的一個(gè)節(jié)點(diǎn)沒(méi)有父節(jié)點(diǎn)贝淤,則該資源是最頂層的預(yù)制件柒竞,需要打包成獨(dú)立的Assetbundle。
- 打包時(shí)應(yīng)該從最底層開(kāi)始逐層向上遍歷播聪,在每一層尋找是否有節(jié)點(diǎn)的父節(jié)點(diǎn)數(shù)量大于1或者等于0朽基,將滿足條件的節(jié)點(diǎn)打成Assetbundle,直到遍歷完整棵樹(shù)。因?yàn)榇虬麬ssetbundle的時(shí)候是會(huì)將所有被依賴到的文件都自動(dòng)打進(jìn)Assetbundle里离陶,所以從底層往上打包可以讓上層的Assetbundle直接依賴到底層的Assetbundle,避免了資源被重復(fù)打進(jìn)不同的Assetbundle里稼虎。
根據(jù)上面的樹(shù),最終打出來(lái)的Assetbundle如下:
b.tex.assetbundle
common.animator.assetbundle
a.prefab.assetbundle
b.prefab.assetbundle
這樣既不會(huì)每一個(gè)文件都打出一個(gè)assetbundle,也省去了手動(dòng)管理依賴關(guān)系的繁瑣招刨。
關(guān)于場(chǎng)景的打包
因?yàn)閡nity3d 5.x之后的版本不再將光照貼圖的信息存放在預(yù)制件中霎俩,因此如果做過(guò)光照烘焙的場(chǎng)景,就必須把預(yù)制件直接擺放在場(chǎng)景中沉眶,動(dòng)態(tài)加載預(yù)制件將丟失光照貼圖的信息茸苇。對(duì)于這種情況,擺放在場(chǎng)景中的預(yù)制件可以不放在最終打包的預(yù)制件目錄中沦寂,因?yàn)榇虬鼒?chǎng)景的時(shí)候會(huì)將場(chǎng)景的資源都統(tǒng)一打包学密,不會(huì)依賴到你所打包的預(yù)制件,因此場(chǎng)景中的預(yù)制件建議單獨(dú)存放目錄传藏。
關(guān)于其他文本文件
其他的文本文件例如json,lua或者其他配置文件腻暮,可以直接在打包的時(shí)候復(fù)制一份到StreamingAssets,保證最后我們所有的資源在手機(jī)上都通過(guò)StreamingAssets來(lái)加載。
工程地址參見(jiàn):https://github.com/yrsc/AssetBundleFramework