当前位置:网站首页>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 "));
}
}
边栏推荐
- 【opencv】图像形态学操作-opencv标记不同连通域的位置
- 10 distributed databases that take you to the galaxy
- Function pointer and pointer function in C language
- [Android kotlin collaboration] use coroutinecontext to realize the retry logic after a network request fails
- QSlider of QT control style series (I)
- DFS,BFS以及图的遍历搜索
- Leetcode minimum difference in student scores
- Operand of null-aware operation ‘!‘ has type ‘SchedulerBinding‘ which excludes null.
- U++4 interface learning notes
- 想要选择一些部门优先使用 OKR, 应该如何选择试点部门?
猜你喜欢

U++4 interface learning notes

【二叉树】二叉树寻路

AOSP ~Binder 通信原理 (一) - 概要

U++ metadata specifier learning notes

PMP证书有没有必要续期?

IMS data channel concept of 5g vonr+

Ansible overview and module explanation (you just passed today, but yesterday came to your face)

Basic knowledge of road loss of 3GPP channel model

Salesforce 容器化 ISV 场景下的软件供应链安全落地实践

ThinkPHP Association preload with
随机推荐
2. Overview of securities investment funds
If you‘re running pod install manually, make sure flutter pub get is executed first.
做自媒体视频剪辑,专业的人会怎么寻找背景音乐素材?
SQL injection HTTP header injection
NPDP产品经理认证,到底是何方神圣?
一文搞懂常见的网络I/O模型
Autowired注解用于List时的现象解析
Leetcode(417)——太平洋大西洋水流问题
【问道】编译原理
接口间调用为什么要用json、fastjson怎么赋值的、fastjson [email protected]映射关系问题
【PHP SPL笔记】
c语言神经网络基本代码大全及其含义
人体传感器好不好用?怎么用?Aqara绿米、小米之间到底买哪个
HarmonyOS第四次培训
如何设计 API 接口,实现统一格式返回?
QT控件样式系列(一)之QSlider
App embedded H5 --- iPhone soft keyboard blocks input text
Pointer and array are input in function to realize reverse order output
Weebly mobile website editor mobile browsing New Era
Scheduledexecutorservice timer