系列文章目录
文章目录
简介
addressable 是 unity 官方制作的 AssetBundle 框架,底层还是 ab 包,只是把资源打包、资源分类、资源加载,资源回收等等封装起来了。
一、Unity 中的准备工作
- 在 Package Manager 中搜索添加 Addressables 包
- 顶部菜单 Window -> Asset Management -> Addressables -> Groups 打开 group 窗口。然后在 group 窗口中点击 CreateAddressablesSettings 按钮创建 Addressables 的配置文件
- 需要使用 Addressables 的资源,选中之后在 Inspector 窗口顶端,勾选 Addressable 并在旁边的 label 中填写该资源在 Addressables 中的名称,也就是加载时使用的路径 (默认刚勾选 addressable 时,该处会显示完整路径)
二、各个界面描述
1.Group
- (1)创建新的 group 分组,也可以在下方右键 create new group
- (2)Profile 打包路径,加载路径,这个后面专门讲 Profile 界面再细说
- (3)Play Mode 的3种选择
UseAssetDatabase(fastest) 直接加载文件而不打包,快速但Profiler获取的信息较少
SimulateGroups(advanced) 在不打包的情况下模拟靠近AssetBundle的操作
UseExisingBuild(requires built groups) 实际上是从AssetBundle打包和加载 - (4)打包按钮,常规使用 Build -> New Build -> Default Build 就可以了。除非特殊设置,不如每次项目打包,addressables 都要重新 build 一次
- (5)资源名称,加载时使用的路径
- (6)辅助操作资源的工具,常用的是 Simplify Addressable Names ,把默认的完整路径缩短到只有文件本身的名称
- (7)文件实际路径,在 group 窗口中选择文件,也会在 Project 窗口中自动选中
- (8)资源的 label ,标签分类,批量加载同类资源时会用到
2.Group Setting
在 Group 窗口中选择某个 group ,或者在下面截图中显示的路径,可以打开 group setting,每个 group 对应一个
- (1)配置文件路径
- (2)该 group 中的资源的打包路径,跟加载路径,具体的再后面 Profile 界面细说
- (3)资源压缩的种类
- (4)这个 group 能否改变,后面增量更新再细说
Can Not Change Post Release 您永远不会期望更新的静态内容。后续更新资源的话增量更新(不改变旧资源包,使用新资源包加载改变的内容)
Can Change Post Release 您希望更新的动态内容。后续更新资源的话全量更新(直接替换旧资源)
-(5)点击顶部的 Inspext Top Level Setting 可以跳转到总设置
3.AddressableAssetSettings 总设置
catalog 就是 addressable 的资源管理清单
- (1)路径
- (2)Profile 选择,点击 Manage Profiles 可以跳转到 Profile 窗口
- (3)如果你想要手动的控制 catalog 的更新,就勾选该选项
Addressables.LoadContentCatalogAsync - (4)如果需要热更新,那一定要勾选 Build Remote Catalog
- (5)默认路径,以 group setting 优先
4.Profile 窗口
profile 负责管理资源的打包、加载路径,开发环境,测试环境,正式环境使用不同的模板,实际使用时可以一键切换
- (1)创建模板
- (2)打包平台的名称
- (3)本地路径
- (4)远端路径
RemoteBuildPath 打包出来还是在本地,需要自己提交到服务器
RemoteLoadPath 就是服务器的地址了 - (5)实际使用的地址,可以对着路径看看打包出来都是啥内容
5.Hosting
addressable 提供给本地测试远程加载的服务器
[PrivateIpAddress]:指Unity提供的本地测试服务器IP
[HostingServicePort]:指本地测试服务器端口
[BuildTarget]:当前平台,android或者PC
在group设置信息会显示实际使用的地址
三、使用
1.使用 AssetReference 加载资源
在 inspector 界面开放 AssetReference 类型的变量,与其他的拖拽类似,只是内容是下载的
2.使用 LoadAssetAsync 加载资源
// API
public static AsyncOperationHandle<TObject> LoadAssetAsync<TObject>(IResourceLocation location);
public static AsyncOperationHandle<TObject> LoadAssetAsync<TObject>(object key);
这个key,就是前面添加 Addressables 资源的时候,设置的名称,
3.使用 LoadAssetsAsync 一次加载多个资源
public static AsyncOperationHandle<IList<TObject>> LoadAssetsAsync<TObject>(IEnumerable keys, Action<TObject> callback, MergeMode mode);
public static AsyncOperationHandle<IList<TObject>> LoadAssetsAsync<TObject>(IList<IResourceLocation> locations, Action<TObject> callback);
MergeMode枚举的含义
UseFirst,只返回匹配到的第一个数据
Union,返回包含任何一个key的数据(并集)
Intersection,返回全包含的数据(交集)
4.使用 LoadResourceLocationsAsync 加载资源路径信息
public static AsyncOperationHandle<IList<IResourceLocation>> LoadResourceLocationsAsync(IEnumerable keys, MergeMode mode, Type type = null);
public static AsyncOperationHandle<IList<IResourceLocation>> LoadResourceLocationsAsync(object key, Type type = null);
IResourceLocation 就是 addressable 中资源的路径信息,上面的 LoadAssetAsync 接口也有使用 IResourceLocation 做参数的重载
因为相对于资源本身,IResourceLocation 作为路径信息很小,所以遇到需要一次加载大量资源的时候,可以考虑先加载 IResourceLocation 再用 IResourceLocation 分别加载资源
5.加载场景
public static AsyncOperationHandle<SceneInstance> LoadSceneAsync(object key, LoadSceneMode loadMode = LoadSceneMode.Single, bool activateOnLoad = true, int priority = 100);
public static AsyncOperationHandle<SceneInstance> LoadSceneAsync(IResourceLocation location, LoadSceneMode loadMode = LoadSceneMode.Single, bool activateOnLoad = true, int priority = 100);
6.预加载资源
public static IEnumerator IELoadDependencie(string key, System.Action<string, long> onStartLoad)
{
//计算需要下载资源的大小,单位b
var downLoadSize = Addressables.GetDownloadSizeAsync(key);
yield return downLoadSize;
Debug.Log($"key:{key} num:{downLoadSize.Result}");
onStartLoad?.Invoke(key, downLoadSize.Result);
if (downLoadSize.Result > 0)
{
//下载资源
yield return Addressables.DownloadDependenciesAsync(key, true);
}
Addressables.Release(downLoadSize);
}
downLoadSize.Result 的单位应该是 b ,这个还没仔细确认
7.加载的异步等待
同步接口已经全部 [Obsolete] 了,能用的都是后面带 Async 的接口
加载接口返回 AsyncOperationHandle 对象
- 协程 IEnumerator
参考上方的预加载代码,直接 yield return 就可以了 - 异步 await
var target = await AsyncOperationHandle.Task; - 回调
开启加载后在 Completed 中注册事件
如果该对象已经下载了,再次下载会不会同步直接完成,不走异步逻辑,不太确定 - updata 检查
检查 IsDone
四、增量更新
1.需要勾选setting的BuildRemoteCatlog
2.资源类型是Can Not Change Post Release
3.Groups窗口Tools->Check for Content Update Restrictions
4.在打开窗口选中对应打包平台的文件夹下的.bin文件
5.之后会出现一个显示改动的窗口,选择右下角的Apply Changes
6.改动过的文件会自动的放入名为Content Update的组
7.然后使用Groups窗口Build->Update a Previous Build做增量更新
8.不更新包体时,必须用Update a Previous Build打包,每个包会对应自己的catalog
以前做写的放在文档里的截图都丢了,偷懒没重新截图