当前位置:网站首页>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("下载结束"));
}
}
边栏推荐
- ServiceMesh主要解决的三大痛点
- Why do many people misunderstand technical debt
- Basic idea of counting and sorting
- 【愚公系列】2022年7月 Go教学课程 005-变量
- U++4 接口 学习笔记
- Leetcode minimum difference in student scores
- STM32F103ZE+SHT30检测环境温度与湿度(IIC模拟时序)
- JS variable case output user name
- [line segment tree practice] recent requests + area and retrieval - array modifiable + my schedule I / III
- Mysql database (basic)
猜你喜欢
Flex layout and usage
Tree map: tree view - draw covid-19 array diagram
Markdown编辑器
Inventory host list in ansible (I wish you countless flowers and romance)
指针与数组在函数中输入实现逆序输出
Chapter 9 Yunji datacanvas company has been ranked top 3 in China's machine learning platform market
一文搞懂常见的网络I/O模型
In depth analysis of kubebuilder
sublime使用技巧
Ansible报错:“msg“: “Invalid/incorrect password: Permission denied, please try again.“
随机推荐
Liste des hôtes d'inventaire dans ansible (je vous souhaite des fleurs et de la romance sans fin)
Leetcode longest public prefix
【二叉树】二叉树寻路
Operand of null-aware operation ‘!‘ has type ‘SchedulerBinding‘ which excludes null.
JS variable
Markdown editor
3. Type of fund
指针与数组在函数中输入实现逆序输出
What is Web3
深入解析Kubebuilder
关于01背包个人的一些理解
Weebly移动端网站编辑器 手机浏览新时代
Meow, come, come: do you really know if, if else
When knative meets webassembly
JS variable case output user name
窗口可不是什么便宜的东西
Flask项目使用flask-socketio异常:TypeError: function() argument 1 must be code, not str
Thread和Runnable创建线程的方式对比
STM32F103 realize IAP online upgrade application
九章云极DataCanvas公司获评36氪「最受投资人关注的硬核科技企业」