Unity AssetBundle (AB) 打包詳解

AssetBundle 是 Unity 提供的一種資源打包機制,允許開發者將游戲資源(如模型、紋理、預制體等)打包成獨立的文件,便于動態加載和熱更新。

一、AssetBundle 基礎概念

1. 什么是 AssetBundle

  • 資源壓縮包,包含序列化資源文件

  • 可以包含任意 Unity 支持的資源類型

  • 支持按需加載和卸載

  • 是 Unity 熱更新的基礎技術

2. AssetBundle 優勢

  • 減小初始包體:將非必要資源分離

  • 動態加載:運行時按需加載資源

  • 熱更新:不通過應用商店更新資源

  • 資源共享:多個 AssetBundle 可以共享資源

二、AssetBundle 打包流程

1. 標記資源為 AssetBundle

在 Unity 編輯器中:

  1. 選擇要打包的資源

  2. 在 Inspector 窗口底部找到 AssetBundle 設置

  3. 創建新的 AssetBundle 名稱或選擇現有名稱

    • 格式:bundlename?或?path/bundlename(可添加子文件夾)

2. 編寫打包腳本

using UnityEditor;
using System.IO;public class BuildAssetBundles
{[MenuItem("Assets/Build AssetBundles")]static void BuildAllAssetBundles(){// 創建輸出目錄(如果不存在)string outputPath = "Assets/AssetBundles";if (!Directory.Exists(outputPath)){Directory.CreateDirectory(outputPath);}// 開始打包BuildPipeline.BuildAssetBundles(outputPath, BuildAssetBundleOptions.None, EditorUserBuildSettings.activeBuildTarget);Debug.Log("AssetBundle 打包完成!");}
}

3. 打包選項詳解

BuildAssetBundleOptions?常用選項:

選項說明
None默認選項,使用 LZMA 壓縮
UncompressedAssetBundle不壓縮,加載快但體積大
ChunkBasedCompression使用 LZ4 壓縮,平衡體積和性能
DisableWriteTypeTree不包含類型信息,減小包體但可能不兼容
DeterministicAssetBundle確保相同內容生成相同 hash
ForceRebuildAssetBundle強制重新打包所有 AssetBundle

三、高級打包技巧

1. 依賴管理

// 獲取資源依賴
string[] dependencies = AssetDatabase.GetDependencies("Assets/Prefabs/Player.prefab");// 打包時自動處理依賴
// Unity 會自動將共享資源提取到單獨的 AssetBundle

2. 變體系統

// 設置帶變體的 AssetBundle 名稱
// 格式:bundlename.variant
// 例如:character.hd 和 character.sd// 運行時根據設備選擇加載哪個變體
AssetBundle.LoadFromFile("path/to/character.hd");

3. 腳本化打包

// 更精細控制的打包方式
var builds = new AssetBundleBuild[2];// 第一個 AssetBundle
builds[0].assetBundleName = "environment";
builds[0].assetNames = new[] {"Assets/Scenes/Forest.unity","Assets/Textures/Terrain.psd"
};// 第二個 AssetBundle
builds[1].assetBundleName = "characters";
builds[1].assetNames = new[] {"Assets/Prefabs/Player.prefab","Assets/Animations/Player.controller"
};BuildPipeline.BuildAssetBundles("Assets/AssetBundles", builds, BuildAssetBundleOptions.ChunkBasedCompression,BuildTarget.StandaloneWindows);

四、AssetBundle 清單文件

打包后會生成以下重要文件:

  1. AssetBundles/[YourPlatform]: 各個 AssetBundle 文件

  2. AssetBundles/[YourPlatform].manifest: 平臺總體清單

  3. AssetBundles/[EachBundle].manifest: 每個 AssetBundle 的清單

清單文件包含:

  • 資源信息

  • 依賴信息

  • CRC 校驗碼

  • 資源哈希值

五、AssetBundle 加載方式

1. 本地加載

// 同步加載
AssetBundle localAB = AssetBundle.LoadFromFile("Assets/AssetBundles/characters");
GameObject playerPrefab = localAB.LoadAsset<GameObject>("Player");// 異步加載
AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync("Assets/AssetBundles/characters");
yield return request;
AssetBundle localAB = request.assetBundle;

2. 遠程加載

IEnumerator LoadFromWeb()
{string url = "http://your-server.com/characters";UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);yield return request.SendWebRequest();if(request.result == UnityWebRequest.Result.Success){AssetBundle remoteAB = DownloadHandlerAssetBundle.GetContent(request);GameObject enemyPrefab = remoteAB.LoadAsset<GameObject>("Enemy");}
}

3. 加載依賴

// 先加載主 AssetBundle
AssetBundle manifestAB = AssetBundle.LoadFromFile("Assets/AssetBundles/StandaloneWindows");
AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");// 獲取依賴
string[] dependencies = manifest.GetAllDependencies("characters");// 加載所有依賴
foreach(string dependency in dependencies)
{AssetBundle.LoadFromFile("Assets/AssetBundles/" + dependency);
}// 然后加載主資源包
AssetBundle charactersAB = AssetBundle.LoadFromFile("Assets/AssetBundles/characters");

六、內存管理與卸載

1. 資源卸載

// 卸載單個 AssetBundle(false=只卸載AB,true=同時卸載從中加載的資源)
assetBundle.Unload(false);

// 卸載所有未使用的 AssetBundle 和資源
Resources.UnloadUnusedAssets();

2. 內存管理建議

  • 及時卸載不再需要的 AssetBundle

  • 避免重復加載相同 AssetBundle

  • 注意資源引用關系,防止內存泄漏

  • 使用?Profiler?監控內存使用情況

七、常見問題與解決方案

1. 資源丟失或引用斷裂

解決方案

  • 確保所有依賴資源都正確打包

  • 使用?Addressable Assets?系統替代原始 AssetBundle

2. 打包后資源變大

解決方案

  • 檢查是否包含不必要資源

  • 使用合適的壓縮方式

  • 啟用?DisableWriteTypeTree(犧牲一些兼容性)

3. 跨平臺兼容性問題

解決方案

  • 為每個目標平臺單獨打包

  • 使用?BuildTarget?參數指定正確平臺

4. 熱更新版本管理

解決方案

  • 實現版本比對系統

  • 使用哈希值或版本號管理資源

  • 提供回滾機制

八、最佳實踐

  1. 合理劃分 AssetBundle

    • 按功能模塊劃分(角色、場景、UI等)

    • 按使用頻率劃分(基礎包、常用資源、低頻資源)

    • 按場景劃分(每個場景一個包)

  2. 壓縮策略選擇

    • 初始包:LZMA(高壓縮率)

    • 熱更新:LZ4(快速隨機訪問)

  3. 資源冗余處理

    • 將共享資源提取到公共包

    • 避免資源被多個包重復包含

  4. 開發流程

    • 開發期使用 Editor 模式直接加載

    • 發布前切換為 AssetBundle 加載

    • 自動化打包流程集成 CI/CD

AssetBundle 是 Unity 資源管理的強大工具,合理使用可以顯著優化游戲性能并實現熱更新功能。隨著 Unity 發展,也可以考慮結合 Addressables 系統來獲得更現代化的資源管理體驗。

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

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

相關文章

Python flask入門

Python flask入門 一、路由1.1 常規路由1.2 動態路由1.3 路由的其他高級用法 二、變量規則2.1 示例1&#xff1a;字符串類型&#xff08;默認&#xff09;2.2 示例2&#xff1a;整數類型2.3 示例3&#xff1a;路徑類型 三、自定義轉換器3.1 核心組件詳解3.2 工作流程詳解 四、f…

AI賦能守護行車安全新防線,基于YOLOv5全系列【n/s/m/l/x】參數模型開發構建駕駛車輛場景下駕駛員疲勞分心駕駛行為智能檢測預警系統

在當今社會&#xff0c;隨著科技生產力的飛速發展&#xff0c;汽車早已成為人們日常出行不可或缺的交通工具。它不僅極大地提高了人們的出行效率&#xff0c;也為生活帶來了諸多便利。然而&#xff0c;隨著汽車保有量的不斷增加&#xff0c;交通安全問題也日益凸顯。疲勞駕駛和…

onloyoffice歷史版本功能實現,版本恢復功能,編輯器功能實現 springboot+vue2

文章目錄 onloyoffice歷史版本功能實現&#xff0c;版本恢復功能&#xff0c;編輯器功能實現 springbootvue2前提 需要注意把這個 (改成自己服務器的ip或者域名) 改成 自己服務器的域名或者地址我使用的onloyoffice版本 8.1.3.41. onloyoffice服務器部署 搜索其他文章2. 前段代…

概率論與統計(不確定性分析)主要應用在什么方面?涉及到具體知識是什么?

用戶問的是概率論與統計&#xff08;不確定性分析&#xff09;的主要應用方面&#xff0c;涉及的具體知識以及具體公式。首先&#xff0c;我需要確定概率論與統計在哪些領域有應用&#xff0c;比如工程、金融、醫學、數據科學等等。然后&#xff0c;具體知識部分應該包括概率論…

如何利用快照與備份快速恢復服務器的數據

在服務器上利用**快照&#xff08;Snapshot&#xff09;**和**備份&#xff08;Backup&#xff09;**快速恢復數據&#xff0c;可顯著減少停機時間并確保業務連續性。以下是具體操作步驟和最佳實踐&#xff1a; --- ### **1. 快照&#xff08;Snapshot&#xff09;恢復** **適…

安卓APP開發項目源碼

在移動互聯網蓬勃發展的今天&#xff0c;安卓應用幾乎覆蓋了人們生活的方方面面。從社交、購物&#xff0c;到醫療、教育&#xff0c;APP 的需求呈指數級增長。然而&#xff0c;如何高效、低成本地開發一款質量可靠的安卓應用&#xff0c;仍是很多開發者和團隊關注的核心問題。…

遨游三防|30200mAh、雙露營燈三防平板,見證堆料天花板

在工業4.0與智能化轉型的浪潮中&#xff0c;專業設備對性能、防護及場景適應性的要求日益嚴苛。遨游通訊作為國家級高新技術企業&#xff0c;依托“危、急、特”場景的深耕經驗&#xff0c;推出的旗艦級產品AORO-P300三防平板&#xff0c;以30200mAh超大容量電池、雙露營燈設計…

【Python】Matplotlib:立體永生花繪制

本文代碼部分實現參考自CSDN博客&#xff1a;https://blog.csdn.net/ak_bingbing/article/details/135852038 一、引言 Matplotlib作為Python生態中最著名的可視化庫&#xff0c;其三維繪圖功能可以創造出令人驚嘆的數學藝術。本文將通過一個獨特的參數方程&#xff0c;結合極…

OpenCV 圖形API(57)顏色空間轉換-----將圖像從 RGB 色彩空間轉換為 YUV 色彩空間函數RGB2YUV()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 將圖像從 RGB 色彩空間轉換為 YUV 色彩空間。 該函數將輸入圖像從 RGB 色彩空間轉換為 YUV。R、G 和 B 通道值的常規范圍是 0 到 255。 在進行線…

Kubernetes(K8S)入門階段詳細指南

Kubernetes(K8S)入門階段詳細指南 一、容器技術基礎:Docker核心操作與理解 1.1 Docker核心操作 鏡像管理: 拉取鏡像:docker pull ubuntu(以Ubuntu為例)查看本地鏡像:docker images刪除鏡像:docker rmi <image_id>容器生命周期管理: 啟動容器:docker run -d -…

AI大模型學習十一:?嘗鮮ubuntu 25.04 桌面版私有化sealos cloud + devbox+minio,實戰運行成功

一、說明 沒意思&#xff0c;devbox私有化不支持&#xff0c;看來這個開源意義不大&#xff0c;和宣傳差距很大啊&#xff0c;那devbox就不用玩 用了ubuntu 25.04&#xff0c;內核為GNU/Linux 6.14.0-15-generic x86_64&#xff0c;升級了部分image&#xff0c;過程曲折啊 se…

[GXYCTF2019]Ping Ping Ping

解題步驟 1、先使用 內斂執行 查看當前的php文件 執行 命令執行 發現空格被過濾 ?ip127.0.0.1$IFS|$IFSwhomi 還有一個點就是這個 執行的命令是不能進行拼接的 可能就是被過濾了 | 所以我們使用 ; 進行繞過一下 空格過濾代替 $IFS ${IFS} ${IFS}$9 //這里$1到$9都可以 $IFS$1…

重溫TCP通信過程

文章目錄 1. 慢啟動2. 擁塞避免 3. 快速重傳和快速恢復 初識tcp報文 我們先來簡單認識一下報文的格式,具體理解需要后面詳細介紹 源端口和目的端口:顧名思義就是標識傳輸雙方的信息首部長度:指的是TCP報頭的長度,換句話來說,我們需要用一個屬性來描述報頭的長度,就說明TCP的報…

力扣HOT100之鏈表:23. 合并 K 個升序鏈表

這道題我是用最淳樸最簡單的思路去做的&#xff0c;用一個while循環持續地將當前遍歷到的最小值加入到合并鏈表中&#xff0c;while循環中使用一個for循環遍歷整個指針數組&#xff0c;將其中的最小值和對應下標記錄下來&#xff0c;并將其值加入到合并鏈表中&#xff0c;同時對…

Spring Boot 支持政策

&#x1f9d1;&#x1f4bb; Spring Boot 支持政策 ?? Andy Wilkinson 于2023年12月7日編輯本頁 32次修訂 &#x1f4cc; 核心政策 &#x1f6e1;? VMware Tanzu 開源支持政策 Spring Boot 針對關鍵錯誤和安全問題提供支持 &#x1f4c6; 版本支持周期 1?? 主要版本&a…

WeakAuras Lua Script TOC BOSS2 <Lord Jaraxxus>

WeakAuras Lua腳本&#xff08;WA 字符串&#xff09; 十字軍試煉老2 加拉克蘇斯 血肉成灰 !WA:2!TIv7VnYrz8UXuDudiDN7PqFfCdTHKYLOeN7sBpXvKDIZf36Kyw7KRT3DYE2Dh7DAwV7CZSoXUOIewf4GdAfgbu13LPasv8MS4diavKoH4RSkIp0phXDT8je5FGYZmZU2oVCqrGLJZUpZZoZZB)EEz1wkr9ewjSU6MD5u…

Spring security詳細上手教學(二)用戶管理

Spring security詳細上手教學&#xff08;二&#xff09;用戶管理 這章節主要學習&#xff1a; 如何使用UserDetails接口描述用戶在鑒權流中使用UserDetailsService自定義的UserDetailsService實現自定義的UserDetailsManager實現在鑒權中使用JdbcUserDetialsManager 在Spri…

網絡安全廠商F5榮登2025 CRN AI 100榜單,釋放AI潛力

近期&#xff0c;網絡安全廠商F5憑借其應用交付和安全技術與前沿的人工智能洞察&#xff0c;成功入選“2025 CRN AI 100 榜單”&#xff0c;并躋身“領導者”之列。這一榮譽的獲得&#xff0c;彰顯了F5在助力企業擁抱人工智能創新的過程中&#xff0c;無需犧牲性能、靈活性或安…

4.RabbitMQ - 延遲消息

RabbitMQ延遲消息 文章目錄 RabbitMQ延遲消息一、延遲消息介紹二、實現2.1 死信交換機2.2 延遲消息插件2.3 取消超時訂單 一、延遲消息介紹 延遲消息&#xff1a;生產者發送消息時指定一個時間&#xff0c;消費者不會立刻收到消息&#xff0c;而是在指定時間后才收到消息 用戶…

5.學習筆記-SpringMVC(P53-P60)

1.響應 &#xff08;1&#xff09;響應頁面 &#xff08;2&#xff09;響應數據&#xff08;異步提交&#xff09;&#xff1a;文本數據、json數據 2.REST風格 (1)REST:表現形式狀態轉換。 (2)傳統風格資源描述形式 3.Restful入門案例 5.基于RESTful頁面數據…