当前位置:网站首页>Addressable 预下载

Addressable 预下载

2022-07-06 22:49:00 司军礼

更新并下载脚本

不解释了注释很清晰

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.AddressableAssets.ResourceLocators;

public class CheckUpdateAndDownload
{
    private static CheckUpdateAndDownload _instance;

    public static CheckUpdateAndDownload instance
    {
        get
        {
            if (_instance==null)_instance=new CheckUpdateAndDownload();
            return _instance;
        }
    }
    private float progress;
    private Action completeAct;
    private Action<float> sliderProgressAct;
    private Action<long, long> sizeProgressAct;

    private CheckUpdateAndDownload()
    {
    }

    /// <summary>
    /// 开始更新
    /// </summary>
    public async void StartUpdate(Action<float> progressAct=null,Action completeAct=null)
    {
        this.sliderProgressAct = progressAct;
        this.completeAct = completeAct;
        List<object> updateObjs=await GetUpdateObjs();
        if (updateObjs==null||updateObjs.Count==0)return;
        long size = await GetUpdateSize(updateObjs);
        if (size<=0)return;
        await Downloads(updateObjs);
    }

    /// <summary>
    /// 获取可更新文件
    /// </summary>
    /// <returns></returns>
    async Task<List<object>> GetUpdateObjs()
    {
        //检查可更新目录
        AsyncOperationHandle<List<string>> catalogs=Addressables.CheckForCatalogUpdates(false);
        await catalogs.Task;
        int catalogCount = catalogs.Result.Count;
        if (catalogCount == 0)
        {
            Addressables.Release(catalogs);
            return null;
        }
        //更新可更新目录
        AsyncOperationHandle<List<IResourceLocator>> newCatalogs=Addressables.UpdateCatalogs(catalogs.Result,false);
        await newCatalogs.Task;
        //所有更新之后的目录
        List<IResourceLocator> locators = newCatalogs.Result;
        //需更新的文件列表
        List<object> updateObjs = new List<object>();
        //遍历所有目录,并取出每个目录中的所有文件信息并加入更新列表
        foreach (var locator in locators) updateObjs.AddRange(locator.Keys);
        Addressables.Release(catalogs);
        Addressables.Release(newCatalogs);
        return updateObjs;
    }

    /// <summary>
    /// 获取可更新文件大小
    /// </summary>
    /// <param name="updateObjs">所有可更新文件</param>
    /// <returns></returns>
    async Task<long> GetUpdateSize(List<object> updateObjs)
    {
        var sizeHandle= Addressables.GetDownloadSizeAsync(updateObjs);
        await sizeHandle.Task;
        long updateSize = sizeHandle.Result;
        Addressables.Release(sizeHandle);
        return updateSize;
    }

    /// <summary>
    /// 更新文件
    /// </summary>
    /// <param name="updateObjs">可更新文件列表</param>
    /// <returns></returns>
    async Task Downloads(List<object> updateObjs)
    {
        var clearCacheHandle=Addressables.ClearDependencyCacheAsync(updateObjs,true);
        await clearCacheHandle.Task;
        AsyncOperationHandle downloadHandle=Addressables.DownloadDependenciesAsync(updateObjs,Addressables.MergeMode.Union,false);
        progress = 0;
        while (downloadHandle.Status == AsyncOperationStatus.None) 
        {
            float percentageComplete = downloadHandle.GetDownloadStatus().Percent;
            if (percentageComplete > progress * 1.1) // Report at most every 10% or so
            {
                progress = percentageComplete; // More accurate %
                sliderProgressAct?.Invoke(progress);
            }
            await Task.Delay(100);
        }
        completeAct?.Invoke();
        Addressables.Release(downloadHandle);
    }
}

使用(测试)

public class Test : MonoBehaviour
{
    private void Start()
    {
        CheckUpdateAndDownload.instance.StartUpdate((progress) =>
        {
            Debug.Log("进度:"+progress);
        },()=>Debug.Log("下载结束"));
    }
}
原网站

版权声明
本文为[司军礼]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_42498461/article/details/125560223