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

2026.6.7 - AB包学习(1)

完成了什么

分别用三种方式加载 AB 包中的资源:

  1. 普通同步加载:最简单的用法,直接加载单个 AB 包中的资源

  2. 依赖加载:处理 AB 包之间的依赖关系,分两种写法

  3. 异步加载:运行时动态加载,避免卡顿

示例资源:一个 AB 包里包含BulletCylinder两个预制体。


一、普通同步加载

LoadPath = Application.streamingAssetsPath; // 加载 AB 包文件 AssetBundle ab = AssetBundle.LoadFromFile(LoadPath + "/" + "model"); // 从 AB 包中加载资源 GameObject go = ab.LoadAsset<GameObject>("Bullet"); GameObject go2 = ab.LoadAsset<GameObject>("Cylinder"); // 实例化到场景 Instantiate(go); Instantiate(go2);

关键点:

  • LoadFromFile从磁盘文件加载 AB 包,同步执行,会卡主线程

  • LoadAsset<T>从已加载的 AB 包中获取指定名称的资源

  • 适合启动时加载(配合 Loading 界面)或小文件


二、依赖加载

当 AB 包之间有依赖关系时(比如model包引用了material包里的材质),需要先加载所有依赖包,否则资源会丢失材质或贴图。

写法一:加载全部依赖(简单粗暴)

// 加载主包(Manifest 包) AssetBundle abMain = AssetBundle.LoadFromFile(LoadPath + "/" + "StandaloneWindows"); // 获取 Manifest AssetBundleManifest abManifest = abMain.LoadAsset<AssetBundleManifest>("AssetBundleManifest"); // 获取所有 AB 包名称 string[] depNames = abManifest.GetAllAssetBundles(); // 全部加载 foreach (string depName in depNames) { AssetBundle.LoadFromFile(LoadPath + "/" + depName); }

适用场景:资源数量少、不在乎加载时间。

写法二:只加载指定包的依赖(推荐)

// 获取 "model" 这个包依赖了哪些包 string[] deps = abManifest.GetAllDependencies("model"); // 只加载这些依赖 foreach (string depName in deps) { AssetBundle.LoadFromFile(LoadPath + "/" + depName); }

适用场景:AB 包数量多,只想加载当前需要的包及其依赖,节省内存。

两种写法的区别:

GetAllAssetBundlesGetAllDependencies
加载范围所有 AB 包指定包的依赖
内存占用
适用场景小项目、全量预加载大项目、按需加载

三、异步加载

运行时加载资源,不想卡主线程,就用异步。

IEnumerator ABAsyncLoad(string path) { // 异步加载 AB 包文件 AssetBundleCreateRequest abAsync = AssetBundle.LoadFromFileAsync(path); yield return abAsync; // 等待加载完成,主线程不卡 AssetBundle bundle = abAsync.assetBundle; if (bundle == null) { Debug.LogError("Failed to find AssetBundle"); yield break; } // 从包中同步加载资源(此时包已在内存中,速度很快) GameObject prefab = bundle.LoadAsset<GameObject>("Bullet"); if (prefab != null) { Instantiate(prefab); } } // 调用 StartCoroutine(ABAsyncLoad(LoadPath + "/" + "model"));

关键点:

  • LoadFromFileAsync返回AssetBundleCreateRequest

  • yield return等待加载完成,不阻塞主线程

  • AB 包加载完成后,内部资源的LoadAsset用同步方式即可,因为文件已在内存中

什么时候用异步:

场景推荐方式
启动时加载同步(反正有 Loading 界面)
运行时换武器、切场景异步(不能卡玩家操作)
加载大文件(>10MB)异步
加载小配置文件同步

四、卸载

AssetBundle.UnloadAllAssetBundles(false);

参数区别:

  • false:只卸载 AB 包本身,已加载的资源(预制体、贴图等)保留

  • true:连同所有已加载的资源一起卸载

什么时候用:

  • 切换场景时调用UnloadAllAssetBundles(true)彻底清理

  • 只想释放 AB 包内存,但资源还要用,用false


五、总结

加载方式方法特点
同步加载LoadFromFile简单,会卡主线程
异步加载LoadFromFileAsync不卡主线程,配合协程
依赖加载GetAllDependencies按需加载依赖,省内存
卸载UnloadAllAssetBundles释放 AB 包内存
http://www.jsqmd.com/news/1138620/

相关文章:

  • Claude Code 实战:AI 结对编程如何真正提效,把工具链跑成稳定流程
  • 光刻、刻蚀、薄膜沉积三大主设备 2024 市场格局与国产化挑战分析
  • 16路、24路与总线舵机控制器对比:3款方案选型指南与5大关键参数实测
  • 信创替换走到RFID打印这一步,多少人卡了壳
  • 专业的电销机器人系统哪家好
  • VTube Studio API开发实战:从零构建虚拟主播控制系统的完整指南
  • 厂区全域无源无感监测,视频孪生实现变电站人员越界风险实时告警
  • 1988-2025年 上市公司数绿转型协同度数据 xlsx
  • 支付宝小程序多商户收款方案对比:2种授权模式与 app_auth_token 实战
  • 手游反外挂实战:基于app_process的APK完整性校验方案与千款机型兼容性报告
  • 麦克纳姆轮+步进电机驱动方案:工训赛智能物流小车0.1mm级循迹精度实现
  • 汉明码编码译码推演仿真(P124302169石雨婷)
  • 立创EDA边框层绘制避坑指南:解决3类Gerber导出“边框未闭合”错误
  • 8G显存本地部署:AI漫剧生成工具全流程自动化实践指南
  • 如何轻松下载全网视频音频资源:智能下载神器res-downloader终极指南
  • 零基础教程,包学包会!!———基于助睿ETL多类型文件数据抽取(选做-1)
  • 【JAVA毕设源码分享】基于springboot保护濒危动物公益网站系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • Ubuntu 24.04 Samba 服务配置:3个关键安全参数与防火墙规则详解
  • App 安全测试自动化:MobSF 2024 集成 CI/CD 实现 7 项核心检测
  • Koikatu HF Patch终极指南:5步免费解锁完整游戏体验和200+核心模组
  • File Upload(文件上传)
  • 从噪音困扰到静音享受:TPFanCtrl2如何重塑你的ThinkPad使用体验
  • 2026年理工科论文写作AI测评:5款工具公式生成支持
  • YOLO26 改进 - 注意力机制 CAFM (Convolutional Block Attention Module) 卷积块注意力模块:轻量级设计优化特征提取流程,提升小目标感知
  • AIGC检测是什么?2026年论文AI率检测全攻略与工具推荐
  • CTF Writeup 逆向工程实战:从 DASCTF 2022 赛题看 PHP 反序列化 Fast Destruct 漏洞利用
  • 优测接口超时监控告警配置流程解析
  • 先看一个模式匹配的Case
  • NSK RNFTL5016A5 超重载滚珠丝杠技术详解
  • JESD204B 与 LVDS/CMOS 接口对比:5 大维度实测与 PCB 布局优化指南