当前位置:网站首页>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("下载结束"));
}
}
边栏推荐
- Vscode automatically adds a semicolon and jumps to the next line
- Flask project uses flask socketio exception: typeerror: function() argument 1 must be code, not str
- STM32封装ESP8266一键配置函数:实现实现AP模式和STA模式切换、服务器与客户端创建
- JS 的 try catch finally 中 return 的执行顺序
- A detailed explanation of head pose estimation [collect good articles]
- sublime使用技巧
- Leetcode notes
- Run the command once per second in Bash- Run command every second in Bash?
- 装饰器基础学习02
- 3. Type of fund
猜你喜欢
Camera calibration (I): robot hand eye calibration
九章云极DataCanvas公司摘获「第五届数字金融创新大赛」最高荣誉!
How does vscade use the built-in browser?
Markdown editor
Oracle -- 视图与序列
AttributeError: module ‘torch._ C‘ has no attribute ‘_ cuda_ setDevice‘
Sublime tips
基于Bevy游戏引擎和FPGA的双人游戏
R language principal component PCA, factor analysis, clustering analysis of regional economy analysis of Chongqing Economic Indicators
sublime使用技巧
随机推荐
Canteen user dish relationship system (C language course design)
JS also exports Excel
Batch normalization (Standardization) processing
When knative meets webassembly
A simple and beautiful regression table is produced in one line of code~
全国气象数据/降雨量分布数据/太阳辐射数据/NPP净初级生产力数据/植被覆盖度数据
Section 1: (3) logic chip process substrate selection
How to design API interface and realize unified format return?
2. Overview of securities investment funds
Sublime tips
第一篇论文的写作流程
批量归一化(标准化)处理
Chapter 9 Yunji datacanvas company has been ranked top 3 in China's machine learning platform market
Leetcode notes
STM32封装ESP8266一键配置函数:实现实现AP模式和STA模式切换、服务器与客户端创建
Techniques d'utilisation de sublime
Programmers go to work fishing, so play high-end!
Organize five stages of actual attack and defense drill
Using thread class and runnable interface to realize the difference between multithreading
[practice leads to truth] is the introduction of import and require really the same as what is said on the Internet