using System;
using System.Threading;
using Cysharp.Threading.Tasks;
using GameFramework.Resource;
using UnityGameFramework.Runtime;
using ResourceApplySuccessEventArgs = UnityGameFramework.Runtime.ResourceApplySuccessEventArgs;
using ResourceUpdateAllCompleteEventArgs = UnityGameFramework.Runtime.ResourceUpdateAllCompleteEventArgs;
using ResourceVerifySuccessEventArgs = UnityGameFramework.Runtime.ResourceVerifySuccessEventArgs;
namespace SepCore.AsyncTask
{
///
/// Resource 异步扩展方法
///
public static class ResourceAsyncExtension
{
///
/// 异步加载资源
///
/// 资源类型
/// 资源组件
/// 资源名称
/// 加载优先级
/// 用户自定义数据
/// 加载进度
/// 超时时间(秒),0表示不超时
/// 加载的资源
public static UniTask LoadAssetAsync(this ResourceComponent resourceComponent,
string assetName,
int priority = 0,
object userData = null,
IProgress progress = null,
float timeout = 0f) where T : class
{
var tcs = new UniTaskCompletionSource();
var callbacks = new LoadAssetCallbacks(
(name, asset, duration, ud) => tcs.TrySetResult((T)asset),
(name, status, errorMessage, ud) => tcs.TrySetException(new Exception($"加载资源失败: {name}, status: {status}, error: {errorMessage}")),
(name, p, ud) => progress?.Report(p)
);
resourceComponent.LoadAsset(assetName, typeof(T), priority, callbacks, userData);
if (timeout > 0f)
{
UniTask.Delay(TimeSpan.FromSeconds(timeout), cancellationToken: CancellationToken.None)
.ContinueWith(() => tcs.TrySetException(new TimeoutException($"加载资源超时: {assetName}, {timeout}秒")));
}
return tcs.Task;
}
///
/// 异步等待资源更新完成
///
/// 资源组件
/// 超时时间(秒),0表示不超时
/// 更新完成事件
public static UniTask WaitForResourceUpdateCompleteAsync(this ResourceComponent resourceComponent,
float timeout = 0f)
{
return AsyncTaskHelper.WaitEventAsync(
ResourceUpdateAllCompleteEventArgs.EventId,
null,
timeout
);
}
///
/// 异步等待资源验证完成
///
/// 资源组件
/// 超时时间(秒),0表示不超时
/// 验证成功事件
public static UniTask WaitForResourceVerifyCompleteAsync(this ResourceComponent resourceComponent,
float timeout = 0f)
{
return AsyncTaskHelper.WaitEventAsync(
ResourceVerifySuccessEventArgs.EventId,
null,
timeout
);
}
///
/// 异步等待资源应用完成
///
/// 资源组件
/// 超时时间(秒),0表示不超时
/// 应用成功事件
public static UniTask WaitForResourceApplyCompleteAsync(this ResourceComponent resourceComponent,
float timeout = 0f)
{
return AsyncTaskHelper.WaitEventAsync(
ResourceApplySuccessEventArgs.EventId,
null,
timeout
);
}
}
}