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

Unity中加载AB包(本地加载)

下载AssetBundles插件

  1. 下载地址:https://gitee.com/icejacool/AssetBundles-Browser
  2. 下载成功之后,解压文件。解压之后的文件拖入Unity的Asset文件夹下面。
  3. 应该会有报错,删除AssetBundles-Browser-master文件夹下面的Tests文件夹

配置资源(场景)

1.选中想要打成AB包的场景,在右下角AssetBundle的位置新建标签,以test为例

2.点击Window->AssetBundleBrowser打开打包AB包的界面,刷新界面,显示所有的AB包,确保显示的是你想要打包的场景

3.点击Build页签,设置打包相关信息

  1. 选择目标平台,我选的是Android
  2. 勾选ClearFolders,每次打包的时候删除之前打包的AB包,无缓存重新打包
  3. 选择Compression(压缩方式):
    1. NoCompression:无压缩,加载速度最快,包体最大
    2. LZMA:压缩最狠,加载速度最慢,解压需要占的内存也最多,包体最小
    3. LZ4:微压缩,加载速度较快,包体占三种里的中等(我是本地加载,包体压缩不是最重要,所以选了这个)

4.打包完成之后在Assets的同级文件夹会出现AssetBundles文件夹,里面是对应平台的AB包

加载AB包

获取加载地址

//获取加载AB包的地址 private string GetBundlePath(string sceneName) { string path; #if UNITY_EDITOR path = Application.dataPath.Replace("/Assets", "") + "/AssetBundles/Android/"; #else path =Application.persistentDataPath + "/"; #endif switch (sceneName) { //根据场景名字加载不同的AB包 case "env_04": path = path + "test"; break; } return path; }

异步加载AB包

先定义一个AssetBudle,再进行加载赋值

private AssetBundle assetBundle; private IEnumerator LoadAssetBundleAsync(string sceneName, Action<AssetBundle> callback,int index=1) { Debug.LogError("开始加载ab包...." + sceneName); string bundlePath = GetBundlePath(sceneName); AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(bundlePath); while (!request.isDone) { //Debug.LogError("AB加载中,进度为:" + request.progress); //这里可以放进度条之类的提示 yield return null; } assetBundle = request.assetBundle; if (assetBundle != null) { // 缓存AB包 callback?.Invoke(assetBundle); } else { Debug.LogError($"无法加载AB包: {bundlePath}"); callback?.Invoke(null); } }

加载附加场景

我的项目中设定的是Loading场景一直存在,其他场景叠加显示,所以流程是先卸载当前场景,再加载AB包,最后再加载场景

private IEnumerator LoadNextSceneCoroutine(string _sceneName, Action _loadCompleteEvent = null, Action _completeEveent = null) { //这块是显示UI进度条 yield return StartCoroutine(ShowLoadingUI()); #region 卸载场景 Scene currentScene = SceneManager.GetActiveScene(); AsyncOperation unloadOp = SceneManager.UnloadSceneAsync(currentScene); Debug.LogError("开始卸载"); while (!unloadOp.isDone) { Debug.LogError("卸载中......"); yield return null; } #endregion // 执行GC AssetBundle.UnloadAllAssetBundles(true); yield return Resources.UnloadUnusedAssets(); GC.Collect(); Debug.LogError("卸载成功"); LoadScene(_sceneName, _loadCompleteEvent, _completeEveent); } /// <summary> /// 加载场景 /// </summary> /// <param name="_sceneName">场景名字</param> /// <param name="_loadCompleteEvent">加载完成后的事件</param> /// <param name="_completeEveent"></param> public void LoadScene(string _sceneName,Action _loadCompleteEvent=null,Action _completeEveent=null) { StartCoroutine(LoadSceneCoroutine(_sceneName, _loadCompleteEvent, _completeEveent)); } private IEnumerator LoadSceneCoroutine(string _sceneName, Action _loadCompleteEvent = null, Action _completeEveent = null) { Debug.LogError("开始加载...."+ _sceneName); if (assetBundle != null) { assetBundle.Unload(true); assetBundle = null; GC.Collect(); } string scene = _sceneName; yield return StartCoroutine(LoadAssetBundleAsync(_sceneName, (loadedBundle) => { assetBundle = loadedBundle; })); if (assetBundle != null) { scene = assetBundle.GetAllScenePaths()[0]; } //加载场景 AsyncOperation op = SceneManager.LoadSceneAsync(scene, LoadSceneMode.Additive); while (!op.isDone) { // 实际加载进度(0-0.9) actualProgress = op.progress; yield return null; } Scene newScene = SceneManager.GetSceneByName(_sceneName); if (newScene.IsValid()) { //Debug.LogError("设置新的激活场景"); SceneManager.SetActiveScene(newScene); } yield return Resources.UnloadUnusedAssets(); GC.Collect(); if (_loadCompleteEvent != null) { _loadCompleteEvent(); } yield return new WaitForSecondsRealtime(1); if (_completeEveent != null) { _completeEveent(); } yield break; }
http://www.jsqmd.com/news/605929/

相关文章:

  • 免费开源一款聚合支付系统,已封装微信、支付宝、PayPal、京东、银联、QQ等支付方式
  • SEO_10个简单有效的SEO技巧,快速提升网站排名(280 )
  • 食药环稽查快速农药残留检测仪推荐指南:玉米赤霉烯酮检测仪/瘦肉精检测仪/肉类水分检测仪/胶体金检测/酱油品质检测仪/选择指南 - 优质品牌商家
  • 告别手动换算!用C语言共用体(union)和结构体位域(bit-field)优雅搞定LCD段码屏驱动
  • Qwen3-VL-8B聊天系统部署详解:代理服务器、vLLM后端,一文学会
  • Phi-4-mini-reasoning效果展示:离散数学关系性质判定与反例构造生成
  • GLM-4-9B-Chat-1M实战手册:vLLM日志分析+Chainlit用户行为埋点配置指南
  • 2026梯式热镀锌桥架优质专业厂家推荐榜:槽式热浸锌桥架/槽式热镀锌桥架/槽式电缆桥架/模压桥架/选择指南 - 优质品牌商家
  • CasRel模型在ComfyUI工作流中的集成:可视化关系抽取流程搭建
  • Kandinsky-5.0-I2V-Lite-5s效果展示:让照片“活”起来的惊艳案例
  • 2026年医院化粪池清理工程/化粪池清理/化粪池清理维护推荐品牌厂家 - 行业平台推荐
  • 别再死记硬背了!用Python代码画个图,5分钟搞懂DFA和NFA的区别
  • 企业网站应该如何设计?高端网站设计有诀窍!
  • 手把手教你用LVGL+FreeRTOS在STM32上实现多页面切换(附完整源码)
  • Mac用户也能玩转3D生成?Hunyuan3D-2mini在M1芯片上的实测体验与优化技巧
  • 告别锚框!用CenterPoint搞定自动驾驶3D检测,实测Waymo/NuScenes双SOTA
  • 2026闭式冷却塔优质品牌推荐 全场景选型参考 - 优质品牌商家
  • 2026年口碑好的化粪池清理服务/化粪池清理定期维护实力工厂推荐 - 行业平台推荐
  • 信号处理期末开卷考,我靠这份历年计算题考点梳理拿了高分
  • Z-Image Atelier 与Git版本控制结合:团队协作下的提示词工程管理
  • WD5030降压芯片实战:如何为你的DIY电源模块选对电容和电感(附参数计算)
  • LLM的创造力与不确定性:概率系统的双面性
  • QMCDecode终极指南:3步解锁QQ音乐加密文件,让音乐自由播放
  • 2026年美甲店LED美甲灯/UV美甲灯主流厂家对比评测 - 行业平台推荐
  • Pixel Script Temple 解决Java面试题代码分析与脚本生成
  • 一板多用:AD2428WD-EVB开发板如何同时玩转A2B总线和ADAU1452 DSP开发
  • 用ESP32-S3做个桌面小玩意:语音助手、GIF时钟和网络摄像头三合一(附开源代码与避坑指南)
  • 手把手教你部署MedGemma医学影像助手:打造24小时在线的AI教学导师
  • Z-Image Turbo高算力适配价值:3090/4090显卡Turbo模型优化方案
  • DELL服务器阵列崩溃恢复方法