前言:本着简单的原则想把ab换成Unity的Addressable。测试一下Addressable的资源生成和管理。
最基础的使用方法很多人都写过了,就不重复写了。记录一些在使用过程中的问题和资源状况。
Addressable版本:1.16.10
Unity版本:2019.3
前文地址:关于Addressable转换AssetBundle热更新测试记录(五)
这篇就先说一下如何将Addressable来做成和AssetBundle热更新相似的更新流程。
首先我们要先了解AssetBundle热更新的流程。
1:首次打包资源放在StreamingAssets目录。
2:更新资源时,对比我们原始的资源信息文件。更新有变化的资源。新的资源信息文件替换掉原始的资源文件。
那么我们使用Addressable也把初始资源打入StreamingAssets目录。只需要Group选择LocalBuild路径即可。
那么怎么对比资源信息文件,获取到我们需要更新的资源呢?
async void CheckUpdate()
{
//初始化Addressable
var init = Addressables.InitializeAsync();
await init.Task;
//开始连接服务器检查更新
AsyncOperationHandle<List<string>> checkHandle = Addressables.CheckForCatalogUpdates(false);
//检查结束,验证结果
await checkHandle.Task;
if (checkHandle.Status == AsyncOperationStatus.Succeeded)
{
List<string> catalogs = checkHandle.Result;
if (catalogs != null && catalogs.Count > 0)
{
Debug.Log("download catalogs start");
var updateHandle = Addressables.UpdateCatalogs(catalogs, false);
await updateHandle.Task;
Debug.Log("download catalogs finish");
//获取可更新资源key
List<object> keys = new List<object>();
foreach (var item in updateHandle.Result)
{
foreach (var key in item.Keys)
{
Debug.Log("key1111:" + key);
keys.Add(key);
}
}
Debug.Log("download bundle start");
var sizeHandle = Addressables.GetDownloadSizeAsync(keys);
await sizeHandle.Task;
long totalDownloadSize = sizeHandle.Result;
Debug.Log("下载大小:" + totalDownloadSize);
if (totalDownloadSize > 0)
{
var downloadHandle = Addressables.DownloadDependenciesAsync(keys, Addressables.MergeMode.Union);
await downloadHandle.Task;
Debug.Log("download bundle finish");
}
else
{
Debug.Log("不需要更新");
}
}
else
{
Debug.Log("不需要更新");
}
}
else
{
Debug.Log(checkHandle.Status);
}
Addressables.Release(checkHandle);
Debug.Log("CheckUpdate结束");
}
只需要这一小段即可完成资源内容的更新。确实是比AssetBundle要少写很多代码。
当然我在测试过程中也发现了另外一个方法来获取keys。下面会用另外一个写法来写,因为上面用的 Addressables.GetDownloadSizeAsync();已经标记弃用了。
//确定可更新时可使用
async void StartUpdate()
{
Debug.Log("开始更新资源");
IEnumerable<IResourceLocator> locators = Addressables.ResourceLocators;
foreach (var item in locators)
{
var sizeHandle = Addressables.GetDownloadSizeAsync(item.Keys);
await sizeHandle.Task;
if (sizeHandle.Result > 0)
{
var downloadHandle = Addressables.DownloadDependenciesAsync(item.Keys, Addressables.MergeMode.Union);
await downloadHandle.Task;
}
}
Debug.Log("更新完成");
}
测试结果来看,通过Addressables.ResourceLocators和Addressables.UpdateCatalogs获取到的keys都是完全一致的。
并不知道有什么区别。
以上是资源更新的一个流程。后续会尝试写一些便于Addressable构建的Editor方法。
例如:我们在构建AssetBundle时,会代码标记整个文件夹的资源,会自动给AssetBundle资源命名和打包。
Addressables虽然已经打包好了大部分功能。但关于Group的创建和资源添加现在看来都是手动做的。
那么Addressables能不能也通过我们划分好的文件夹来一键创建Group并添加资源呢?下一篇会尝试这部分内容。