資源打包
Unity5.x打包要方便很多,不需要自己收集依賴。設置了AssetBundle Names的資源會依賴打包,Name相同的資源會打在一起;沒有設置AssetBundle Name的不會依賴打包,直接打進包內,這部分資源有可能會出現冗余,需要注意。
規劃資源目錄
不同類型的資源使用不同的子目錄,比如:角色,武器,場景,粒子,UI等。子目錄下繼續劃分:材質,貼圖,動畫,模型等目錄。所有資源可以放在Resources目錄下。規劃打包粒度
粒度不能太小,以避免AssetBundle數量過多;粒度不能太大,避免資源冗余和小改動需要更新較大的AssetBundle。-
設置AssetBundle Name
- 根據不同資源的打包粒度,設置其AssetBundle Name。因為這里是以資源目錄為導向的,所以要提交規劃好資源目錄結構。
- 未設置Name的資源如果被依賴,則會直接打進包內。
- 未設置Name的資源如果不被任何資源依賴,比如預設,則不會被打包。
-
執行打包API
將AssetBundle文件保存在工程目錄中下的子文件夾中。比如工程目錄中的AssetBundle文件夾下,這樣Unity就不會自動導入這部分資源了。
AssetBundle目錄下劃分不同平臺的子目錄,存放不同平臺的資源。如:iOS,Android等。
更改默認的manifest文件與其AssetBundle文件名。manifest默認名稱為當前目錄的名字,為了方便加載,可以統一改為"manifest","manifest.manifest"。
生成資源版本號
生成文件列表FileList
記錄所有AssetBundle文件相對于StreamingAssets目錄的路徑(全部小寫),對應的CRC。拷貝至StreamingAssets目錄
當需要以AssetBundle模式運行游戲,或BuildPlayer時,需要將對應平臺下的AssetBundle文件拷貝至StreamingAssets目錄。更新CDN
將AssetBundle資源,FileList,版本號上傳至CDN。不同版本資源存放在以版本號命名的目錄中;而不是刪除舊資源然后放在同一個目錄中。這樣可以保證CDN中始終是最新的資源,因為加參數的方式在某些CDN上會無效。排查資源冗余
可以使用Unity開源插件"AssetBundle Browser Tool"來查看冗余的那部分資源。實際上它并不是分析已經打好的AssetBundle,而是分析當前設置的AssetBundle Name。
資源更新
獲取最新版本號
下載FileList
由版本號可以算出對應版本的資源更新地址,以及FileList文件。對比FileList
對比本地FileList與遠程FileList,計算哪些文件需要更新(對比CRC),哪些文件需要刪除。下載AssetBundle
使用WebRequest接口下載,將AssetBundle二進制數據寫入Application.persistentDataPath目錄下。同時校驗CRC,看是不是下載數據有誤。重新下載CRC較驗失敗的資源
下載完成后,需要再次校驗。
AssetBundle加載
經過前一階段的資源更新,這一步資源完全從本地加載。從AB中加載Asset時,必須保證所有依賴的AB都已經加載。
獲取依賴AssetBundle
通過AssetBundleManifest對象,可以獲取到依賴信息(已包括遞歸依賴)。將資源存入待加載隊列
將待加載AssetBundle與其依賴存入待加載隊列。執行加載
從待加載隊列中取出待加載項,可以設置最大加載數,同一時間最多只能有N個資源同時加載。異步加載接口:LoadFromFileAsync
緩存AssetBundle
將加載完成的AB緩存在字典中,下次還有加載請求,直接返回。Unity中同一個AB只能加載一次,否則會報錯。加載/緩存Asset
當所有依賴AB加載完后,再從AB中加載Asset。看看緩存的Asset,沒有再從AssetBundle中加載。
AssetBundle清理
加載完Asset后,卸載AB
調用AB.Unload(false)
卸載AB,減少AB的內存占用。此時AB與相關的Asset斷開鏈接。再次LoadAsset
當需要再次從卸載掉的AB中加載Asset時,因為已經緩存了Asset了,所以這可以直接返回,不需要重新加載AB;如果沒有緩存Asset,則需要再次加載AB。-
?退出場景
Destroy Object
代碼中清除Asset引用
AB.Unload(true)
清除AB緩存
清除Asset緩存
Resources.UnloadUnusedAssets()
補充
記錄AssetBundle引用
緩存的AB需要記錄被引用數,原因是當需要卸載一個AB,也需要卸載其依賴的AB。但如果被依賴的AB也被其它資源依賴,如果直接卸載,會導致其它資源引用丟失。只有當引用數為1(即只被自己引用)才可以卸載。待加載資源重復請求
將要加載的AB可能已經在加載隊列中(被不同資源共同依賴),所以不必重復加入隊列中,只需要添加加載項的回調即可。否則會出現同一個AB被加載多次(Unity也會報錯提示)。加載失敗的處理