unity热更新json_Unity热更新之AssetBundle打包篇
unity3d在5.0之后打包Assetbundle變得比之前簡(jiǎn)單多了,最簡(jiǎn)單的辦法就是把所有資源都標(biāo)記Assetbundle的Flag,然后直接調(diào)用unity3d的打包Assetbundle即可,詳情可參見官方文檔。
通過標(biāo)記打包方式的優(yōu)缺點(diǎn)
這種打包方式的優(yōu)點(diǎn)在于簡(jiǎn)單,缺點(diǎn)在于不好管理需要需要打包的資源。舉例來說就是你必須把所有需要打包的資源都標(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里。
通過buildmap方式打包的優(yōu)缺點(diǎn)
unity還提供了一種buildmap的打包方式,可以自己管理需要打包的資源,優(yōu)點(diǎn)在于自己管理依賴關(guān)系,可以最大程度的控制打包粒度,缺點(diǎn)就是需要寫點(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)建一棵依賴樹,根據(jù)依賴樹進(jìn)行打包。
2.構(gòu)建依賴樹
unity3d提供了 AssetDatabase.GetDependencies的方法來獲取一個(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)系樹如下:
buildtree.png
注意:unity提供了獲取預(yù)制件的直接依賴和所有依賴(包括間接依賴),構(gòu)建依賴樹時(shí)需要獲取預(yù)制件的直接依賴,再依次獲取每一個(gè)依賴文件的直接依賴,直到獲取到最底層的依賴,由此構(gòu)建出所有預(yù)制件形成的依賴樹。
3.根據(jù)依賴樹打包Assetbundle
如果樹的一個(gè)節(jié)點(diǎn)有2個(gè)或以上的父節(jié)點(diǎn),則該資源被2個(gè)或多個(gè)其他資源所依賴,該節(jié)點(diǎn)需要打包成獨(dú)立的Assetbundle。
如果樹的一個(gè)節(jié)點(diǎn)沒有父節(jié)點(diǎn),則該資源是最頂層的預(yù)制件,需要打包成獨(dú)立的Assetbundle。
打包時(shí)應(yīng)該從最底層開始逐層向上遍歷,在每一層尋找是否有節(jié)點(diǎn)的父節(jié)點(diǎn)數(shù)量大于1或者等于0,將滿足條件的節(jié)點(diǎn)打成Assetbundle,直到遍歷完整棵樹。因?yàn)榇虬麬ssetbundle的時(shí)候是會(huì)將所有被依賴到的文件都自動(dòng)打進(jìn)Assetbundle里,所以從底層往上打包可以讓上層的Assetbundle直接依賴到底層的Assetbundle,避免了資源被重復(fù)打進(jìn)不同的Assetbundle里。
根據(jù)上面的樹,最終打出來的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ù)制件中,因此如果做過光照烘焙的場(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ī)上都通過StreamingAssets來加載。
總結(jié)
以上是生活随笔為你收集整理的unity热更新json_Unity热更新之AssetBundle打包篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c# ef报错_C#中Entity Fr
- 下一篇: hive sql循环_hive存储过程