AssetBundle的概念
AssetBundle又称AB包,是Unity提供的一种用于存储资源的资源压缩包,是对Unity 初始Resources的一种扩展;一般使用的策略是把必须的资源和不需要更新的资源放在Resources文件夹下,其他的资源放在AssetBundle下面。
Unity中的AssetBundle系统是对资源管理的一种扩展,通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,可以动态地加载和卸载AB包,继而有选择地加载内容。
AssetBundle的优势
- AB包存储位置自定义,继而可放入可读可写的路径下便于实现热更新。
- AB包自定义压缩方式,可以选择不压缩或选择LZMA和LZ4等压缩方式,减小包的大小,更快的进行网络传输。
- 资源可分布在不同的AB包中,最大程度减少运行时的内存压力, 可做到即用即加载,有选择的加载需要的内容。
- AB包支持后期进行动态更新,显著减小初始安装包的大小,非核心资源以AB包形式上传服务器,后期运行时动态加载,提高用户体验。
AssetBundle的特性 - . AB包可以存储绝大部分Unity资源但无法直接存储C#脚本,所以代码的热更新需要使用Lua或者存储编译后的DLL文件。
- . AB包不能重复进行加载,当AB包已经加载进内存后必须卸载后才能重新加载。
- 多个资源分布在不同的AB包可能会出现一个预制体的贴图等部分资源不在同一个包下,直接加载会出现部分资源丢失的情况,即AB包之间是存在依赖关系的,在加载当前AB包时需要一并加载其所依赖的包。
- 打包完成后,会自动生成一个主包(主包名称随平台不同而不同),主包的manifest下会存储有版本号、校验码(CRC)、所有其它包的相关信息(名称、依赖关系)
AssetBundle的使用流程比较繁琐,大致上分为五个阶段:分组、打包、加载包、加载资源、卸载包。
(1) 分组:分组就是将资源按照特定的分组策略将资源归类,这些类型在打包阶段会生成各自的资源包,AssetBundle分组需要考虑一些关键因素包括:资源之间的关联性(尽量将相互依赖的资源放在一个资源包内)、资源动态性(尽量将需要频繁加载的资源放在一个资源包内)、资源大小(尽量不要将大资源和小资源放在一个资源包内)、版本管理(Variable是对资源包的进一步分组,比如资源包的不同版本,当设置了不同的Variable,AssetBundle将会对变体进行单独打包)。
(2) 打包:通过Unity内置的BuildPipeline API可以实现将设置分组的资源进行打包,具体的打包流程包括: (a) 遍历AssetBundle分组:Unity会遍历每个已设置的AssetBundle分组。 (b) 查找分组中的资源和依赖项:对于每个分组,Unity会查找分组中的资源及其依赖项,并创建一个资源清单。 © 序列化资源和依赖项:Unity会将这些资源和依赖项进行序列化,并将它们保存到一个二进制文件中,以供加载时使用。 (d) 生成资源包文件:通过将资源清单和序列化的资源打包成二进制文件,Unity生成一个包含所有资源的AssetBundle文件。 (e) 压缩和加密(可选):可以选择对生成的AssetBundle文件进行压缩和加密,以确保资源的安全性和网络传输效率。
(3) 加载包:经过打包后,资源包并没有被加载进内存,通过AssetBundle API可以将资源包加载进内存。
(4) 加载资源:通过资产包在内存中的对象来加载包中的资源。
(5) 卸载资源:当资源被加载进内存后,资源就由应用程序接管了,资源包就可以从内存中卸载了。
Addressable概述
鉴于AssetBundle的局限性,Unity进一步在AssetBundle API的基础上开发了Addressable。Addressable可在 Unity 编辑器中为开发者提供用户界面,并自动执行以前只能在脚本中手动管理的流程。使用Addressable系统,开发者可以在 Unity 编辑器中组织资源,并让系统处理依赖项、资源位置以及内存分配和解除分配。
1.安装Addressable
在Window->Package Manager中的Unity Registry中搜索Addressable,并安装。
安装成功后,可以看到多出了一个Window / Asset Management / Addressables菜单,
2、创建Addressables Settings
点击Groups菜单,点击Create Addressables Settings按钮,并新建一个Group
其实每个Group都 是一个配置文件
3.选中资源文件,在Inspector窗口中勾选Addressable,它会自动添加到默认的Group中,也可以手动拖拽进去
4.设置Build Path与Load Path
在Inspector窗口中,选中Packed Assets,将Build Path改为RemoteBuildPath,将Load Path改为RemoteLoadPath,如下

5.打Addressable资源包
在Addressables Groups窗口中,点击Build / New Build / Default Build Script,就会开始打Addressable资源包了,等它打包完毕即可
6、加载Addressable资源
我们加载资源的时候,并不需要知道目标资源到底是在哪个Group中,也不需要知道这个Group到底是本地资源包还是远程资源包,统一通过资源的Addressable Name来加载
刚接触Addressable,如有问题烦请指出。谢谢。后续持续更新。。。