using System; using System.Collections; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.AddressableAssets.ResourceLocators; using UnityEngine.ResourceManagement.AsyncOperations; namespace MuHua { /// /// 按标签加载可寻址资源 /// public class AALabel { public readonly string label; public Action OnProgress; public Action OnError; public Action OnComplete; public T result; /// 按标签加载可寻址资源 public AALabel(string label, Action OnComplete = null) { this.label = label; this.OnComplete = OnComplete; } /// 获取异步句柄 public AsyncOperationHandle Handle() { return Addressables.LoadAssetAsync(label); } /// 加载资源 public async void Load() => await ALoad(); /// 加载资源 public async Task ALoad() { AsyncOperationHandle handle = Handle(); if (handle.Status == AsyncOperationStatus.Failed) { OnError?.Invoke($"无法加载资源!(label={label} , type={typeof(T)})"); return; } while (!handle.IsDone) { float downloadProgress = handle.GetDownloadStatus().Percent; float loadProgress = handle.PercentComplete; float totalProgress = (downloadProgress + loadProgress) / 2.0f; // Debug.Log($"下载进度: {downloadProgress * 100}% , 加载进度: {loadProgress * 100}% , 总进度: {totalProgress * 100}%"); OnProgress?.Invoke(totalProgress); await Task.Delay(100); } OnComplete?.Invoke(handle.Result); } /// 加载资源 public IEnumerator ILoad() { AsyncOperationHandle handle = Handle(); if (handle.Status == AsyncOperationStatus.Failed) { OnError?.Invoke($"无法加载资源!(label={label} , type={typeof(T)})"); yield break; } while (!handle.IsDone) { float downloadProgress = handle.GetDownloadStatus().Percent; float loadProgress = handle.PercentComplete; float totalProgress = (downloadProgress + loadProgress) / 2.0f; OnProgress?.Invoke(totalProgress); yield return new WaitForEndOfFrame(); } result = handle.Result; OnComplete?.Invoke(handle.Result); } } }