unity热更新json_Unity热更新之AssetBundle打包篇
unity3d在5.0之后打包Assetbundle變得比之前簡單多了,最簡單的辦法就是把所有資源都標記Assetbundle的Flag,然后直接調用unity3d的打包Assetbundle即可,詳情可參見官方文檔。
通過標記打包方式的優缺點
這種打包方式的優點在于簡單,缺點在于不好管理需要需要打包的資源。舉例來說就是你必須把所有需要打包的資源都標記上Assetbundle的Flag,(包括prefab,texture,material,fbx,animation等),最后容易把資源打得特別散,造成每一個文件都是一個assetbundle。這樣其實對于加載是特別不友好的,每一個assetbundle的引用都至少會有大約4kb的內存。如果不這樣做,只對prefab做標記的話,容易造成資源的重復打包,一些texture,fbx可能會多次打進不同的assetbundle里。
通過buildmap方式打包的優缺點
unity還提供了一種buildmap的打包方式,可以自己管理需要打包的資源,優點在于自己管理依賴關系,可以最大程度的控制打包粒度,缺點就是需要寫點代碼,大約500行。
使用buildmap打包的流程
1.目錄管理
管理好你的資源目錄,把需要單獨打包和不需要單獨打包的文件放在不同的目錄下,默認需要單獨打包的只有預制件目錄,其他的目錄一般可以根據依賴自動打進包里,可以參考下面的目錄結構:
Assets
|--Prefabs
|--a.prefab
|--b.prefab
|--Textures
|--a.tex
|--b.tex
|--c.tex
|--Materials
|--Aniamations
|--Models
|--Other
我們打包前會遍歷Prefabs目錄,得到每一個prefab的依賴,構建一棵依賴樹,根據依賴樹進行打包。
2.構建依賴樹
unity3d提供了 AssetDatabase.GetDependencies的方法來獲取一個文件的依賴關系,我們假設遍歷完預制件文件夾后得到的依賴關系如下:
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
最終形成的依賴關系樹如下:
buildtree.png
注意:unity提供了獲取預制件的直接依賴和所有依賴(包括間接依賴),構建依賴樹時需要獲取預制件的直接依賴,再依次獲取每一個依賴文件的直接依賴,直到獲取到最底層的依賴,由此構建出所有預制件形成的依賴樹。
3.根據依賴樹打包Assetbundle
如果樹的一個節點有2個或以上的父節點,則該資源被2個或多個其他資源所依賴,該節點需要打包成獨立的Assetbundle。
如果樹的一個節點沒有父節點,則該資源是最頂層的預制件,需要打包成獨立的Assetbundle。
打包時應該從最底層開始逐層向上遍歷,在每一層尋找是否有節點的父節點數量大于1或者等于0,將滿足條件的節點打成Assetbundle,直到遍歷完整棵樹。因為打包Assetbundle的時候是會將所有被依賴到的文件都自動打進Assetbundle里,所以從底層往上打包可以讓上層的Assetbundle直接依賴到底層的Assetbundle,避免了資源被重復打進不同的Assetbundle里。
根據上面的樹,最終打出來的Assetbundle如下:
b.tex.assetbundle
common.animator.assetbundle
a.prefab.assetbundle
b.prefab.assetbundle
這樣既不會每一個文件都打出一個assetbundle,也省去了手動管理依賴關系的繁瑣。
關于場景的打包
因為unity3d 5.x之后的版本不再將光照貼圖的信息存放在預制件中,因此如果做過光照烘焙的場景,就必須把預制件直接擺放在場景中,動態加載預制件將丟失光照貼圖的信息。對于這種情況,擺放在場景中的預制件可以不放在最終打包的預制件目錄中,因為打包場景的時候會將場景的資源都統一打包,不會依賴到你所打包的預制件,因此場景中的預制件建議單獨存放目錄。
關于其他文本文件
其他的文本文件例如json,lua或者其他配置文件,可以直接在打包的時候復制一份到StreamingAssets,保證最后我們所有的資源在手機上都通過StreamingAssets來加載。
總結
以上是生活随笔為你收集整理的unity热更新json_Unity热更新之AssetBundle打包篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c# ef报错_C#中Entity Fr
- 下一篇: hive sql循环_hive存储过程