Unity資源管理——操作一覽(編輯器下 運行時)

本文由 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引用計數,代理卸載

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95452.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95452.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95452.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Sentinel vs Resilience4j vs Bucket4j:分布式限流方案對比與實戰

Sentinel vs Resilience4j vs Bucket4j:分布式限流方案對比與實戰 在高并發微服務架構中,合理的限流策略是保護系統穩定性與可用性的關鍵。本文將從問題背景入手,對 Sentinel、Resilience4j 和 Bucket4j 三種常見的分布式限流方案進行對比&am…

Spring Boot 3.5.3 集成 Log4j2 日志系統

在 Spring Boot 3.5.3 中&#xff0c;要將默認的 Logback 替換為 Log4j2&#xff0c;需要以下步驟&#xff1a;1. 添加 Log4j2 依賴在 pom.xml中排除默認的 Logback 依賴并添加 Log4j2 依賴&#xff1a;<dependencies><!-- 排除默認的 Logback --><dependency&g…

ADB圖片上傳輪播

可以通過ADB在機器中進行上傳照片&#xff0c;進行其他圖片播放 當前系統架構分析 1. 現有組件結構 ImageCarouselActivity: 主要的輪播Activity&#xff0c;繼承自BaseBindingActivity 實現全屏顯示和沉浸式體驗使用ViewPager2進行圖片輪播支持自動輪播&#xff08;5秒間隔&…

異常處理小妙招——2.代碼的韌性:如何實現操作的原子性回滾

一、核心思想&#xff1a;什么叫“失敗原子性”&#xff1f; 想象一下你在玩一個闖關游戲&#xff0c;有一關需要你連續跳過三個平臺。 不具有原子性&#xff1a;你跳過了第一個和第二個平臺&#xff0c;但在跳第三個時失敗了、掉下去了。結果你不僅沒過關&#xff0c;連之前跳…

Crawl4AI:為LLM而生的下一代網頁爬蟲框架

在當今AI驅動的信息處理時代&#xff0c;從網頁中高效提取高質量、結構化的數據已成為連接互聯網與大語言模型&#xff08;LLM&#xff09;的關鍵橋梁。Crawl4AI作為一款開源的LLM友好型網頁爬蟲與刮板工具&#xff0c;正迅速成為開發者處理這一任務的首選解決方案。本文將深入…

輸出一個愛心

輸出效果&#xff1a;代碼實現&#xff1a;#include<iostream> #include<iomanip> #include<algorithm> using namespace std; int main() {int n;cin>>n;char a[8] {I,L,O,V,E,Y,O,U};int j 1;int k n*21;int o n*2-2;int aa 0; for(int i 0;i&…

深度集成Dify API:企業級RAG知識庫管理平臺解決方案

&#x1f3af; 需求和概述 當前基于Dify實現企業級的智能問答系統需求日益增長&#xff0c;Dify的低代碼開發框架和功能完整、靈活適應各種需求的特色得到廣大大模型和RAG開發著的歡迎。但是Dify在落地企業級應用時候&#xff0c;也面臨不少的問題&#xff0c;最突出的就是Dif…

C++循環越界問題

for (int i 0; i < historyTableList.size() - 1; i) {historyList2.push_back(historyTableList[i]); } historyList.size()0時&#xff0c;為什么會異常historyTableList.size() 返回的是 size_t 類型&#xff08;無符號整數&#xff09;當 size() 0 時&#xff0c;size…

MongoDB 從零到入門:實用指南

什么是 MongoDB&#xff1f; MongoDB 是一個流行的非關系型數據庫&#xff08;NoSQL&#xff09;&#xff0c;它使用類似 JSON 的文檔來存儲數據&#xff0c;而不是傳統的表格形式。這使得 MongoDB 非常靈活&#xff0c;特別適合處理半結構化數據和快速迭代的開發場景。 核心概…

WebRTC音頻QoS方法五(音頻變速算法之Expand算法實現)

一、概述介紹在WebRTC中&#xff0c;存在兩種擴展算法&#xff1a;PreemptiveExpand和Expand。盡管這兩種算法的目標都是擴展音頻信號&#xff0c;但它們的實現原理和應用場景卻有所不同。PreemptiveExpand&#xff08;預防性擴張&#xff09;主動擴展策略&#xff0c;旨在防止…

【Python - 基礎 - 工具】解決pycharm“No Python interpreter configured for the project”問題

解決pycharm“No Python interpreter configured for the project”問題 當你在 PyCharm 中遇到“No Python interpreter configured for the project”錯誤時&#xff0c;意味著你的項目沒有配置 Python 解釋器。以下是解決該問題的步驟。 示例 # 嘗試運行代碼時出現錯誤 prin…

Elasticsearch創建索引分片和副本大小建議

在Elasticsearch中&#xff0c;?分片(shard)和副本(replica)? 的設置直接影響集群性能、容錯能力和擴展性。以下是最佳實踐指南&#xff1a;核心概念?類型??描述??是否可修改??主分片(Primary Shard)?數據的最小存儲單元&#xff0c;每個索引被拆分成多個主分片? 索…

“人工智能+虛擬仿真”開啟新學期智慧學習之旅

在教育領域掀起數字化革新浪潮的今天&#xff0c;新學期的開啟不僅意味著知識探索新征程的起步&#xff0c;更蘊含著教育模式深度變革的無限可能。虛擬仿真技術作為教育現代化的關鍵驅動力&#xff0c;正重塑學習體驗&#xff0c;引領教育范式轉移。人工智能與虛擬仿真技術的結…

Photoshop用戶必看:讓你的PSD像JPG一樣可預覽

軟件介紹 Photoshop縮略圖補丁插件3.8.0.96是一款實用的工具&#xff0c;它能夠將PSD格式的文件&#xff08;Photoshop的專用格式&#xff09;以縮略圖的形式顯示出來。這一功能極大地提升了用戶在管理和查找圖像文件時的效率&#xff0c;使得看圖、找圖變得更加輕松便捷。該插…

idea2025.1.5安裝+pj

寫在前邊&#xff1a;如果是卸載舊版本IDEA重裝&#xff0c;一定記得之前的插件啥的&#xff0c;截個圖。還有主題字體設置啥的 目錄背景原因卸載原來版本安裝教程背景原因 原來的2022.2不支持jdk21的語言版本 卸載原來版本 1、如何徹底卸載 IDE, 可參考這篇的文章&#xff…

(四)Python控制結構(條件結構)

程序中的語句默認會按照自上而下的順序逐條執行&#xff0c;但通過一些特定的語句可以更改語句的執行順序&#xff0c;使之產生跳躍、回溯等現象&#xff0c;進而靈活地控制程序的執行流程。控制結構是編程中用于控制程序執行流程的語句&#xff0c;程序的三種基本控制結構為&a…

血緣元數據采集開放標準:OpenLineage Guides 使用 Apache Airflow? 和 OpenLineage + Marquez 入門

OpenLineage 是一個用于元數據和血緣采集的開放標準&#xff0c;專為在作業運行時動態采集數據而設計。它通過統一的命名策略定義了由作業&#xff08;Job&#xff09;、運行實例&#xff08;Run&#xff09;和數據集&#xff08;Dataset&#xff09; 組成的通用模型&#xff0…

FPGA|Quartus II 中使用TCL文件進行引腳一鍵分配

在FPGA設計過程中&#xff0c;合理的引腳分配是確保硬件功能正確實現的關鍵步驟之一。Quartus II 提供了通過 TCL&#xff08;Tool Command Language&#xff09;腳本自動化引腳分配的功能&#xff0c;這不僅可以大大提高設計效率&#xff0c;還能夠確保引腳分配的精確性和可重…

【Docker/Redis】服務端高并發分布式結構演進之路

目錄 概述 常見概念 基本概念 應用&#xff08;Application&#xff09;/ 系統&#xff08;System&#xff09; 模塊&#xff08;Module&#xff09;/ 組件&#xff08;Component&#xff09; 分布式&#xff08;Distributed&#xff09; 集群&#xff08;Cluster&#x…

【Excel】將一個單元格內??的多行文本,??拆分成多個單元格,每個單元格一行??

??所有文本都堆積在“prefix”列頂部的同一個單元格里&#xff08;很可能是B10單元格&#xff09;&#xff0c;并且它們是用空格分隔的&#xff0c;而不是換行符。??因此&#xff0c;您不需要處理換行符&#xff0c;而是需要??按“空格”進行分列&#xff0c;并且將分列后…