当前位置:网站首页>Addressable pre Download

Addressable pre Download

2022-07-07 05:17:00 Si Junli

Update and download scripts

No explanation, the notes are very clear

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>
    ///  Start updating 
    /// </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>
    ///  Get updatable files 
    /// </summary>
    /// <returns></returns>
    async Task<List<object>> GetUpdateObjs()
    {
        // Check the updatable directory 
        AsyncOperationHandle<List<string>> catalogs=Addressables.CheckForCatalogUpdates(false);
        await catalogs.Task;
        int catalogCount = catalogs.Result.Count;
        if (catalogCount == 0)
        {
            Addressables.Release(catalogs);
            return null;
        }
        // Update updatable directory 
        AsyncOperationHandle<List<IResourceLocator>> newCatalogs=Addressables.UpdateCatalogs(catalogs.Result,false);
        await newCatalogs.Task;
        // All updated directories 
        List<IResourceLocator> locators = newCatalogs.Result;
        // List of documents to be updated 
        List<object> updateObjs = new List<object>();
        // Traverse all directories , And take out all the file information in each directory and add it to the update list 
        foreach (var locator in locators) updateObjs.AddRange(locator.Keys);
        Addressables.Release(catalogs);
        Addressables.Release(newCatalogs);
        return updateObjs;
    }

    /// <summary>
    ///  Get the updatable file size 
    /// </summary>
    /// <param name="updateObjs"> All updatable files </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>
    ///  Update file 
    /// </summary>
    /// <param name="updateObjs"> List of updatable files </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);
    }
}

Use ( test )

public class Test : MonoBehaviour
{
    private void Start()
    {
        CheckUpdateAndDownload.instance.StartUpdate((progress) =>
        {
            Debug.Log(" speed of progress :"+progress);
        },()=>Debug.Log(" Download the end "));
    }
}
原网站

版权声明
本文为[Si Junli]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/188/202207062249153970.html