本文由 NRatel 歷史筆記整理而來,如有錯誤歡迎指正。
資源管理是Unity游戲開發中的重頭工作之一。
以下按【編輯器下】和 【運行時】,共十多個步驟,一覽總體流程(內容巨大,不細展開)。
一、資源導入Unity【編輯器下】
Unity資源導入設置方式選擇-CSDN博客文章瀏覽閱讀428次,點贊6次,收藏8次。?一種可保存和重復應用的資源導入配置模板。需先在 Inspector 窗口中為某種類型資源(如 Texture、Model、AudioClip)配置好所有導入設置后,將其保存為一個 .preset 文件。然后在 Inspector 窗口中手動拖拽或應用 Preset 到選中的資源(可多選資源批量應用)。支持只應用部分字段。可在 Edit -> Project Settings -> Preset Manager 中設置默認 Preset。https://blog.csdn.net/NRatel/article/details/151068515
二、制作游戲【編輯器下】
????????創建Unity內資源
????????資源加工
三、資源分組【編輯器下】
1、一般分組策略
????????⑴、按邏輯實體分組
????????⑵、按類型分組
????????⑶、按并發內容分組
2、兩種準備方式
????????⑴、設置ab標簽(assetBundleName 和 assetBundleVariant)
????????????????可以以/分隔的字符串作為標簽,將成為ab的輸出子路徑
????????????????unity設置ab標簽時會統一轉為小寫
????????????????后綴應設置為常規 .unity3d 或 .bundle,安卓 mainTemplate.gradle 中 aaptOptions 的 noCompress 的 BUILTIN_NOCOMPRESS默認為此兩種后綴
????????⑵、自己利用特定規則構建 AssetBundleBuild[]
????????⑶、注意事項
? ? ? ? ? ? ? ? ①、無ab標簽的資源被重復打入不同ab的問題
????????????????????????解決方式1:將X及依賴X的Y、Z資源,全打入一個ab中(可能使ab過大,后期可能還要拆分)
????????????????????????解決方式2:接能保證不被同時加載(只占硬盤不占內存,可忍)
????????????????????????解決方式3:提出公共依賴作為單獨ab(徹底解決,但增加復雜度)
????????????????②、循環依賴問題
????????????????③、ab變體問題
????????????????④、圖集打包問題
????????????????⑤、嵌套預設打包問題
????????????????⑥、Shader及其變體打包問題
????????????????⑦、壓縮格式選擇問題(LZMA、LZ4、不壓縮)
四、資源打包【編輯器下】
1、兩種AB打包方式
????????⑴、按照已設置的標簽打 BuildPipeline.BuildAssetBundles(); 是增量的(已打過未變化的不會重新打)
????????⑵、按照自己構建的數組打 BuildAssetBundles(AssetBundleBuild[] builds);
2、BuildAssetBundleOptions 選項
????????⑴、BuildAssetBundleOptions.None 默認使用LZMA壓縮
? ? ? ? ⑵、BuildAssetBundleOptions.StrictMode 有問題暴露出來
????????⑶、BuildAssetBundleOptions.DisableLoadAssetByFileName(從ab中加載資源時可以只傳入文件名,而不用傳入完整路徑和后綴)BuildAssetBundleOptions.DisableLoadAssetByFileNameWithExtension(從ab中加載資源時可以只傳入文件名和后綴,而不傳入完整路徑)應該明確加載,所以統一按路徑加載,禁用這兩種快捷方式,以節省性能注意:unity設置ab標簽時會統一轉為小寫,加載時win平臺大小寫不敏感,但移動平臺敏感所以,應統一為小寫。
????????⑷、AssetBundleStripUnityVersion 去掉,避免提升Unity小版本導致所有ab變化
????????⑸、DisableWriteTypeTree 建議不要動,向下兼容,省心,否則提升Unity版本之后必須記得將全部資源更新一次
3、生成/拷貝非AB資源,并加密&壓縮
五、資源版本化【編輯器下】
1、 加載原始無版本化資源清單
2、創建版本化資源清單
3、設置摘要信息
4、處理每個資源文件(改名拷貝)
5、保存版本化清單文件
六、資源發布
1、上傳資源到遠程資源服務器(打包App時、熱更時)
2、或內置資源到包內(打包App時)
七、App打包
見我其他打包相關文章
八、App上架
見我其他傳包相關文章
九、App更新【運行時】
????????強制更新(更新后才可進入,點擊更新跳轉到應用商店)
????????非強制更新(可進入老版本)
十、資源更新(熱更)【運行時】
1、根據項目需要,兩種方式選擇
????????方式1、直接下載到 Application.persistentDataPath
????????方式2、先下載到 Application.temporaryCachePath,再 拷貝到 Application.persistentDataPath
2、適應性/優缺點對比
????????優點:方便對資源進行自定義壓縮/解壓。像單機類型的還能不必要求他更新完成
????????缺點:占硬盤(極限情況下2倍)、多了拷貝/解壓過程(拖慢進入時間,多了運行時候io)
3、按版本資源清單增量下載/刪除
? ? ? ? 獲取版本資源完整清單
????????合并歷史完成/未完成
????????計算最新需下載清單
????????按清單下載
4、下載方法
????????下載普通文件
????????????????UnityWebRequest.Get(string uri)
????????下載 AB文件
????????????????如果不是下載即用,可直接按普通文件下載
????????????????UnityWebRequestAssetBundle.GetAssetBundle(string uri)
5、下載實現——異步單步任務(底層支持、獨立模塊)
????????????????成功、失敗回調
????????????????可主動終止
????????異步多步并行任務(底層支持、獨立模塊)
????????????????成功、失敗、進度回調
????????????????可主動終止
????????限制同時最多
????????可選擇失敗時是否終止
????????可設置優先級?
6、下載實現——單個文件下載器(異步單步任務的一個實現)(內部可能性全部提出為配置)
????????url【傳入配置】
????????保存位置【傳入配置】
????????是否斷點下載【傳入配置】
????????????????大文件需要斷點續傳
????????重試次數【傳入配置】
????????????????默認0
????????使用協程/子線程執行(先固定協程吧)
????????成功、失敗回調
7、下載實現——文件列表下載器(使用異步多步任務)
????????整體下載完成后操作(完成回調中)
????????????????如:整體完成后統一解壓
????????處理下載失敗的情況(失敗回調中)
????????????????考慮:若是網絡問題應該立即終止,若是文件問題可先下載其他文件
????????單個文件下載完成后操作(進度回調中)
????????????????計數
8、下載實現——多列表下載器(合并下載N個文件列表)(多個分包時)
????????方式一:串行下載多個列表
????????方式二:將多個列表合并為一個列表;再下載這個大列表
十一、加載AB到內存【運行時】
1、加載/創建方法
? ? ? ? ⑴、從內存區域創建 AssetBundle.LoadFromMemory(byte[] binary)
????????????????可用于ab加密解密,但速度慢且內存會至少翻倍,不推薦使用
? ? ? ? ⑵、從本地硬盤加載 AssetBundle.LoadFromFile(string path)
????????????????支持加載任意壓縮類型的ab,LZMA格式將在內存中被解壓
????????????????在移動設備中,只會將 ab 的 頭部數據加載進內存,其他的數據保留在磁盤中
????????????????在 Unity 編輯器中,會將 ab 的全部數據加載進內存。這會使 Profiler 出現內存峰值,實際設備不會出現
? ? ? ? ⑶、AssetBundle.LoadFromStream(Stream stream)
????????????????支持任意壓縮類型,LZMA將在內存中解壓,速度與LoadFromFile類似,可用于ab加密解密
2、支持可尋址加載
????????一個自定義加載地址,無論資源在 Assets 下的任意子路徑中(使資源可隨意移動)
????????一個自定義加載地址,無論ab在 Assets目錄(編輯器下),還是在 stramingAssets 或 persistDataPath 目錄,還是在遠程(可不支持)
3、依賴處理
????????遞歸加載其依賴項,以保證LoadAsset時無引用丟失
十二、加載AB內資源到內存【運行時】
加載方法????????ab.LoadAsset(string name)
十三、創建游戲對象/組件實例【運行時】
根據資源類型不同,復制 或 引用資源
????????Prefab:復制
????????Texture、Shader:引用
????????Mesh、Material :復制 或 引用Shared
十四、銷毀游戲對象/組件實例【運行時】
1、銷毀/解除引用資源
????????銷毀 GameObject.Destroy()
????????以非附加方式加載場景,Application.LoadLevel()
????????????????將銷毀當前場景中的所有對象(部分對象除外)
????????????????DontDestroyOnLoad 的對象不會被此方法銷毀
????????????????HideFlags 包含或是 DontSave 的對象不會被此方法銷毀
????????解除引用如 xxx.texture = null 等
十五、卸載內存中資源【運行時】
1、卸載方法
????????Resources.UnloadAsset(Object assetToUnload)
????????Resources.UnloadUnusedAssets()
????????????????當內容較多時可能卡頓
????????????????以非附加方式加載場景時,將銷毀當前場景中的所有對象并自動調用本方法
????????????????HideFlags 包含或是 DontUnloadUnusedAsset 的資源不會被此方法卸載(只能主動指定卸載)
十六、卸載AB【運行時】
1、卸載方法
????????ab.Unload(bool unloadAllLoadedObjects)
? ? ? ? ? ? ? ? 參數指定true時:卸載ab header,同時卸載所有從ab內加載的資源對象(即使正在場景中被使用)(應盡量使用此方式)
????????????????參數指定false時:只卸載ab header,被引用的ab內資源將駐留(該資源將和ab無關)(后續可使用Resources.UnloadUnusedAssets清理)
????????AssetBundle.UnloadAllAssetBundles(bool unloadAllObjects);
2、ab引用計數,代理卸載