資源打包
Unity5.x打包要方便很多类垫,不需要自己收集依賴。設(shè)置了AssetBundle Names的資源會依賴打包,Name相同的資源會打在一起仔掸;沒有設(shè)置AssetBundle Name的不會依賴打包,直接打進包內(nèi)医清,這部分資源有可能會出現(xiàn)冗余起暮,需要注意。
規(guī)劃資源目錄
不同類型的資源使用不同的子目錄会烙,比如:角色负懦,武器,場景柏腻,粒子纸厉,UI等。子目錄下繼續(xù)劃分:材質(zhì)五嫂,貼圖颗品,動畫,模型等目錄沃缘。所有資源可以放在Resources目錄下躯枢。規(guī)劃打包粒度
粒度不能太小,以避免AssetBundle數(shù)量過多孩灯;粒度不能太大闺金,避免資源冗余和小改動需要更新較大的AssetBundle。-
設(shè)置AssetBundle Name
- 根據(jù)不同資源的打包粒度峰档,設(shè)置其AssetBundle Name败匹。因為這里是以資源目錄為導向的,所以要提交規(guī)劃好資源目錄結(jié)構(gòu)讥巡。
- 未設(shè)置Name的資源如果被依賴掀亩,則會直接打進包內(nèi)。
- 未設(shè)置Name的資源如果不被任何資源依賴欢顷,比如預(yù)設(shè)槽棍,則不會被打包。
-
執(zhí)行打包API
將AssetBundle文件保存在工程目錄中下的子文件夾中。比如工程目錄中的AssetBundle文件夾下炼七,這樣Unity就不會自動導入這部分資源了缆巧。
AssetBundle目錄下劃分不同平臺的子目錄,存放不同平臺的資源豌拙。如:iOS陕悬,Android等。
更改默認的manifest文件與其AssetBundle文件名按傅。manifest默認名稱為當前目錄的名字捉超,為了方便加載,可以統(tǒng)一改為"manifest"唯绍,"manifest.manifest"拼岳。
生成資源版本號
生成文件列表FileList
記錄所有AssetBundle文件相對于StreamingAssets目錄的路徑(全部小寫),對應(yīng)的CRC况芒。拷貝至StreamingAssets目錄
當需要以AssetBundle模式運行游戲惜纸,或BuildPlayer時,需要將對應(yīng)平臺下的AssetBundle文件拷貝至StreamingAssets目錄牛柒。更新CDN
將AssetBundle資源堪簿,F(xiàn)ileList,版本號上傳至CDN皮壁。不同版本資源存放在以版本號命名的目錄中;而不是刪除舊資源然后放在同一個目錄中哪审。這樣可以保證CDN中始終是最新的資源蛾魄,因為加參數(shù)的方式在某些CDN上會無效。排查資源冗余
可以使用Unity開源插件"AssetBundle Browser Tool"來查看冗余的那部分資源湿滓。實際上它并不是分析已經(jīng)打好的AssetBundle滴须,而是分析當前設(shè)置的AssetBundle Name。
資源更新
獲取最新版本號
下載FileList
由版本號可以算出對應(yīng)版本的資源更新地址叽奥,以及FileList文件扔水。對比FileList
對比本地FileList與遠程FileList,計算哪些文件需要更新(對比CRC)朝氓,哪些文件需要刪除魔市。下載AssetBundle
使用WebRequest接口下載,將AssetBundle二進制數(shù)據(jù)寫入Application.persistentDataPath目錄下赵哲。同時校驗CRC待德,看是不是下載數(shù)據(jù)有誤。重新下載CRC較驗失敗的資源
下載完成后枫夺,需要再次校驗将宪。
AssetBundle加載
經(jīng)過前一階段的資源更新,這一步資源完全從本地加載。從AB中加載Asset時较坛,必須保證所有依賴的AB都已經(jīng)加載印蔗。
獲取依賴AssetBundle
通過AssetBundleManifest對象,可以獲取到依賴信息(已包括遞歸依賴)丑勤。將資源存入待加載隊列
將待加載AssetBundle與其依賴存入待加載隊列喻鳄。執(zhí)行加載
從待加載隊列中取出待加載項,可以設(shè)置最大加載數(shù)确封,同一時間最多只能有N個資源同時加載除呵。異步加載接口:LoadFromFileAsync
緩存AssetBundle
將加載完成的AB緩存在字典中,下次還有加載請求爪喘,直接返回颜曾。Unity中同一個AB只能加載一次,否則會報錯秉剑。加載/緩存Asset
當所有依賴AB加載完后泛豪,再從AB中加載Asset≌炫簦看看緩存的Asset诡曙,沒有再從AssetBundle中加載。
AssetBundle清理
加載完Asset后略水,卸載AB
調(diào)用AB.Unload(false)
卸載AB价卤,減少AB的內(nèi)存占用。此時AB與相關(guān)的Asset斷開鏈接渊涝。再次LoadAsset
當需要再次從卸載掉的AB中加載Asset時慎璧,因為已經(jīng)緩存了Asset了,所以這可以直接返回跨释,不需要重新加載AB胸私;如果沒有緩存Asset,則需要再次加載AB鳖谈。-
?退出場景
Destroy Object
代碼中清除Asset引用
AB.Unload(true)
清除AB緩存
清除Asset緩存
Resources.UnloadUnusedAssets()
補充
記錄AssetBundle引用
緩存的AB需要記錄被引用數(shù)岁疼,原因是當需要卸載一個AB,也需要卸載其依賴的AB缆娃。但如果被依賴的AB也被其它資源依賴捷绒,如果直接卸載,會導致其它資源引用丟失龄恋。只有當引用數(shù)為1(即只被自己引用)才可以卸載疙驾。待加載資源重復(fù)請求
將要加載的AB可能已經(jīng)在加載隊列中(被不同資源共同依賴),所以不必重復(fù)加入隊列中郭毕,只需要添加加載項的回調(diào)即可它碎。否則會出現(xiàn)同一個AB被加載多次(Unity也會報錯提示)。加載失敗的處理