Unity熱更新之AssetBundle打包篇

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ù)如下:

buildtree.png

注意: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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毯侦,一起剝皮案震驚了整個(gè)濱河市哭靖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侈离,老刑警劉巖试幽,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異卦碾,居然都是意外死亡铺坞,警方通過(guò)查閱死者的電腦和手機(jī)起宽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)济榨,“玉大人坯沪,你說(shuō)我怎么就攤上這事∏芑” “怎么了腐晾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)丐一。 經(jīng)常有香客問(wèn)我藻糖,道長(zhǎng),這世上最難降的妖魔是什么库车? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任巨柒,我火速辦了婚禮,結(jié)果婚禮上凝颇,老公的妹妹穿的比我還像新娘潘拱。我一直安慰自己疹鳄,他們只是感情好拧略,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瘪弓,像睡著了一般垫蛆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腺怯,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天袱饭,我揣著相機(jī)與錄音,去河邊找鬼呛占。 笑死虑乖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晾虑。 我是一名探鬼主播疹味,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼帜篇!你這毒婦竟也來(lái)了糙捺?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤笙隙,失蹤者是張志新(化名)和其女友劉穎洪灯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體竟痰,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡签钩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年掏呼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片边臼。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哄尔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出柠并,到底是詐尸還是另有隱情岭接,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布臼予,位于F島的核電站鸣戴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏粘拾。R本人自食惡果不足惜窄锅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缰雇。 院中可真熱鬧入偷,春花似錦、人聲如沸械哟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)暇咆。三九已至锋爪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爸业,已是汗流浹背其骄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扯旷,地道東北人拯爽。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像钧忽,于是被迫代替她去往敵國(guó)和親毯炮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容