本篇主要讲解使用Addressables系统做资源更新,基于Addressables1.8.5版本,下面简称AA系统
热更新
上一篇说了如何使用AA系统进行资源更新,现在讨论一下如何让资源随包发出,并且在更新的时候更新整个AB包.
- Addressables.InternalIdTransformFunc 这个接口可以重写更新地址.
我的思路就是一开始所有的Group都设置为Remote Non Static类型的.并且使用AB包的Hash值作为包名,如下图.
打包的时候,会生成AB包在服务器目录,在应用程序发布的时候,把AB包复制进StreamingAssets中.然后在加载的时候,先检查本地是否有资源,且本地资源是否是最新的,如果没有则下载最新的AB包.注意catalog文件永远得保持为最新的.
Addressables.InternalIdTransformFunc = InternalIdTransformFunc;
private string InternalIdTransformFunc(UnityEngine.ResourceManagement.ResourceLocations.IResourceLocation location)
{
//判定是否是一个AB包的请求
if (location.Data is AssetBundleRequestOptions)
{
//PrimaryKey是AB包的名字
//path就是StreamingAssets/Bundles/AB包名.bundle,其中Bundles是自定义文件夹名字,发布应用程序时,复制的目录
var path = Path.Combine(Addressables.RuntimePath, "Bundles", location.PrimaryKey);
if (File.Exists(path))
{
return path;
}
}
return location.InternalId;
}
直接检测本地目录中是否存在AB包, 因为是使用的Hash值作为的包名,如果本地存在这个包,就直接返回这个包的本地地址,那么AA系统就会根据这个地址去加载AB包,而不是去远程下载.假如这个AB包被更新了,那么包名会改变,在本地目录下就会找不到这个包,这个时候再返回真实的远程更新地址去下载文件.