当前位置: 首页 > news >正文

AssetBundle 技术文档

1. 概述

  • AssetBundle 是 Unity 提供的一种资源打包与加载机制,用于将资源(模型、贴图、音频、Prefab 等)打包成二进制文件,在运行时按需加载。
  • 主要用途:
    • 减少首包体积。
    • 按需加载资源,降低内存占用。
    • 支持热更新(结合 PersistentDataPath)。

2. 资源路径对比

路径类型 特点 是否可写 常见用途
Resources/ 打包进应用,运行时可用 Resources.Load 加载 小型静态资源,快速加载
StreamingAssets/ 原样拷贝进包,跨平台路径不同 首包资源、配置文件
PersistentDataPath 运行时生成,可读写 热更新资源、用户数据
Application.dataPath 项目数据目录 调试用,不适合运行时加载

3. AssetBundle 管理器示例代码

下面是一个完整的 ABMgr 管理器,支持同步、异步、依赖加载和卸载。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;public class ABMgr : SingletonAutoMono<ABMgr>
{// 主包private AssetBundle mainAB = null;// 依赖包配置文件private AssetBundleManifest manifest = null;// 已加载的 AB 包缓存Dictionary<string, AssetBundle> abDic = new Dictionary<string, AssetBundle>();/// <summary>/// AB 包路径/// </summary>private string PathUrl => Application.streamingAssetsPath + "/";private string MainABName {get {
#if UNITY_IOSreturn "IOS";
#elif UNITY_ANDROIDreturn "Android";
#elsereturn "PC";
#endif}}// 加载 AB 包及依赖public void LoadAB(string abName) {if (mainAB == null) {mainAB = AssetBundle.LoadFromFile(PathUrl + MainABName);manifest = mainAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");}AssetBundle ab;string[] strs = manifest.GetAllDependencies(abName);for (int i = 0; i < strs.Length; i++) {if (!abDic.ContainsKey(strs[i])) {ab = AssetBundle.LoadFromFile(PathUrl + strs[i]);abDic.Add(strs[i], ab);}}if (!abDic.ContainsKey(abName)) {ab = AssetBundle.LoadFromFile(PathUrl + abName);abDic.Add(abName, ab);}}// 同步加载(不推荐)public Object LoadRes(string abName, string resName) {LoadAB(abName);Object obj = abDic[abName].LoadAsset(resName);return obj is GameObject ? Instantiate(obj) as GameObject : obj;}// 同步加载(指定类型)public Object LoadRes(string abName, string resName, System.Type type) {LoadAB(abName);Object obj = abDic[abName].LoadAsset(resName, type);return obj is GameObject ? Instantiate(obj) as GameObject : obj;}// 同步加载(泛型)public T LoadRes<T>(string abName, string resName) where T : Object {LoadAB(abName);T obj = abDic[abName].LoadAsset<T>(resName);return obj is GameObject ? Instantiate(obj) as T : obj;}// 异步加载(非泛型)public void LoadResAsync(string abName, string resName, UnityAction<Object> callBack) {StartCoroutine(ReallyLoadResAsync(abName, resName, callBack));}public IEnumerator ReallyLoadResAsync(string abName, string resName, UnityAction<Object> callBack) {LoadAB(abName);AssetBundleRequest abr = abDic[abName].LoadAssetAsync(resName);yield return abr;callBack(abr.asset is GameObject ? Instantiate(abr.asset) : abr.asset);}// 异步加载(指定类型)public void LoadResAsync(string abName, string resName, System.Type type, UnityAction<Object> callBack) {StartCoroutine(ReallyLoadResAsync(abName, resName, callBack));}public IEnumerator ReallyLoadResAsync(string abName, string resName, System.Type type, UnityAction<Object> callBack) {LoadAB(abName);AssetBundleRequest abr = abDic[abName].LoadAssetAsync(resName, type);yield return abr;callBack(abr.asset is GameObject ? Instantiate(abr.asset) : abr.asset);}// 异步加载(泛型)public void LoadResAsync<T>(string abName, string resName, UnityAction<T> callBack) where T : Object {StartCoroutine(ReallyLoadResAsync<T>(abName, resName, callBack));}public IEnumerator ReallyLoadResAsync<T>(string abName, string resName, UnityAction<T> callBack) where T : Object {LoadAB(abName);AssetBundleRequest abr = abDic[abName].LoadAssetAsync<T>(resName);yield return abr;callBack(abr.asset is GameObject ? Instantiate(abr.asset) as T : abr.asset as T);}// 卸载单个包public void UnLoad(string abName) {if (abDic.ContainsKey(abName)) {abDic[abName].Unload(false);abDic.Remove(abName);}}// 卸载所有包public void ClearAB() {AssetBundle.UnloadAllAssetBundles(false);abDic.Clear();mainAB = null;manifest = null;}
}

4. 常见问题与注意事项

  • 重复加载同一个 AB 包:会报错,需缓存引用或先卸载再加载。
  • 同名资源:Unity 用 GUID 区分,不会报错,但加载时可能歧义,推荐用泛型或路径。
  • 热更新:StreamingAssets 只用于首包,更新资源必须下载到 PersistentDataPath。
  • 依赖管理:通过 AssetBundleManifest.GetAllDependencies 获取依赖并先行加载。

http://www.jsqmd.com/news/374414/

相关文章:

  • 工程测绘新势力!2026工程测量轻量化无人机建图识别系统供应商与猎翼无人机推荐 - 品牌2025
  • 2026年山东数控折弯机费用探讨,靠谱厂商排名出炉 - myqiye
  • 水仙花数 - ace-
  • 分期乐里的微信立减金可以这样兑换 - 团团收购物卡回收
  • 2026少儿编程机构怎么选?十大权威品牌综合实力榜发布!家长必看 - 匠言榜单
  • 基于单片机控制的电子万年历的设计
  • 探寻阜阳靠谱的美发美容培训学校排名,安徽新东方高级排第几? - 工业品牌热点
  • 探讨AND婚礼市场口碑怎么样,为您的婚礼选择保驾护航 - 工业品网
  • 2026年靠谱旋转塔厂家费用大揭秘,天鸿游乐全年龄段适用 - mypinpai
  • 基于PLC的锅炉温度控制系统设计
  • 金融行业合规 IM 推荐:哪款审计功能最强? - 企业数字化观察家
  • 2026年碳化铪口碑排行榜,靠谱厂家推荐不容错过 - 工业品网
  • 基于S7-200SMART系列PLC卫生纸机控制系统的设计
  • 技术前沿与实战考量:猎翼单兵无人机系统公司哪家好(2026最新) - 品牌2025
  • 感应电机故障诊断系统研究
  • 闭式冷却塔厂家优选指南 2026 行业 TOP5 品牌重磅发布 - 深度智识库
  • 2026年金红石钛白粉运输配送便捷的供应企业,口碑如何 - 工业推荐榜
  • deepseek-解读《关于完善全国统一电力市场体系的实施意见》
  • Android 日志系统5——logd 写日志过程分析二
  • 跨境汇款被冻,万里汇WorldFirst中非直通车能否担当外贸交易大任?
  • 2026年常州靠谱的专业环保评价机构分析,费用怎么算 - 工业品牌热点
  • 即构实时互动AI Agent 2026年重磅升级:支持用户情绪识别,多情感TTS
  • 深度评测:本地新型撬装设备供应商的服务与口碑,中低压管件/保温管道/合金管道/压力容器/异径管件,撬装产品设备厂家有哪些 - 品牌推荐师
  • 某LLM问答系统安全测试报告:提示词注入与越狱攻击分析
  • 2026年标识标牌系统分类及应用功能分析,哪家制造商性价比高 - myqiye
  • 2026 干湿联合冷却塔厂家哪家好?权威榜单一文读懂 - 深度智识库
  • 优质干燥设备哪里找?这些厂家市场口碑不俗,耙式干燥机/干燥设备/真空螺旋干燥机/闪蒸干燥机,干燥设备品牌口碑推荐 - 品牌推荐师
  • 如何轻松地将联系人从 iPhone 同步到 Mac
  • color: var(--el-color-success); CSS里面使用函数
  • 2026年,诚信GEO推广公司如何成为行业TOP 5? - 品牌企业推荐师(官方)