当前位置:网站首页>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("下载结束"));
}
}
边栏推荐
- 5G VoNR+之IMS Data Channel概念
- Ansible reports an error: "MSG": "invalid/incorrect password: permission denied, please try again“
- Talk about the importance of making it clear
- Function pointer and pointer function in C language
- Mysql database (basic)
- JS variable case output user name
- Detect when a tab bar item is pressed
- 【ArcGIS教程】专题图制作-人口密度分布图——人口密度分析
- Ansible概述和模块解释(你刚走过了今天,而扑面而来的却是昨天)
- 动态生成表格
猜你喜欢
Analysis -- MySQL statement execution process & MySQL architecture
Chapter 9 Yunji datacanvas company won the highest honor of the "fifth digital finance innovation competition"!
Vscode automatically adds a semicolon and jumps to the next line
Chapter 9 Yunji datacanvas was rated as 36 krypton "the hard core technology enterprise most concerned by investors"
R language principal component PCA, factor analysis, clustering analysis of regional economy analysis of Chongqing Economic Indicators
[hand torn STL] list
AttributeError: module ‘torch._C‘ has no attribute ‘_cuda_setDevice‘
[line segment tree practice] recent requests + area and retrieval - array modifiable + my schedule I / III
In depth analysis of kubebuilder
Flex layout and usage
随机推荐
How to design API interface and realize unified format return?
A detailed explanation of head pose estimation [collect good articles]
JS also exports Excel
【数模】Matlab allcycles()函数的源代码(2021a之前版本没有)
Code source de la fonction [analogique numérique] MATLAB allcycles () (non disponible avant 2021a)
If you‘re running pod install manually, make sure flutter pub get is executed first.
Appium practice | make the test faster, more stable and more reliable (I): slice test
STM32F103ZE+SHT30检测环境温度与湿度(IIC模拟时序)
【愚公系列】2022年7月 Go教学课程 005-变量
Pointer and array are input in function to realize reverse order output
[736. LISP syntax parsing]
What is Web3
接口间调用为什么要用json、fastjson怎么赋值的、fastjson [email protected]映射关系问题
U++ 游戏类 学习笔记
How to package the parsed Excel data into objects and write this object set into the database?
谈谈讲清楚这件事的重要性
app内嵌h5---iphone软键盘遮挡输入文字
Basic knowledge of road loss of 3GPP channel model
全国气象数据/降雨量分布数据/太阳辐射数据/NPP净初级生产力数据/植被覆盖度数据
STM32 encapsulates the one key configuration function of esp8266: realize the switching between AP mode and sta mode, and the creation of server and client