前言:本着简单的原则想把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并添加资源呢?下一篇会尝试这部分内容。