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 ); } } }