// using System;
// using System.Collections.Generic;
// using System.Linq;
// using System.Threading.Tasks;
// using UnityEngine;
// using UnityEngine.AddressableAssets;
// using UnityEngine.ResourceManagement.AsyncOperations;
// using UnityEngine.ResourceManagement.ResourceProviders;
// using UnityEngine.SceneManagement;
// using Stary.Evo;
//
// public class AddressableLoad : Singleton<AddressableLoad>
// {
//     private Dictionary<string, AsyncOperationHandle> nameCaches = new Dictionary<string, AsyncOperationHandle>();
//     private AsyncOperationHandle ScenesHandle; //当前场景的Addressable Handle
//
//
//     /// <summary>
//     ///异步读取指定的Addressable类型的数据
//     /// </summary>
//     /// <param name="addressName"></param>
//     /// <param name="onComplete">执行成功的回调</param>
//     /// <param name="onFailed">执行失败的回调</param>
//     /// <param name="address">路径</param>
//     public async Task<T> LoadAssetASync<T>(string addressName) where T : UnityEngine.Object
//     {
//         try
//         {
//             if (nameCaches.TryGetValue(addressName, out var existingHandle))
//             {
//                 await existingHandle.Task;
//                 if (existingHandle.Status == AsyncOperationStatus.Succeeded)
//                 {
//                     var result = (T)existingHandle.Result;
//                     return result;
//                 }
//                 else
//                 {
//                     nameCaches.Remove(addressName);
//                 }
//             }
//
//             var handle = Addressables.LoadAssetAsync<T>(addressName);
//             nameCaches.Add(addressName, handle);
//             await handle.Task;
//             return handle.Result;
//         }
//         catch (Exception e)
//         {
//             Debug.LogError($"加载资源失败: 【{addressName}】\n{e.Message}");
//             return null;
//         }
//     }
//
//     /// <summary>
//     /// 同步读取指定的Addressable类型的数据
//     /// </summary>
//     /// <param name="addressName"></param>
//     /// <param name="onComplete">执行成功的回调</param>
//     /// <param name="onFailed">执行失败的回调</param>
//     /// <param name="address">路径</param>
//     public void LoadAssetSync<T>(string addressName, Action<T> onComplete, Action onFailed) where T : UnityEngine.Object
//     {
//         if (nameCaches.ContainsKey(addressName))
//         {
//             var handle = this.nameCaches[addressName];
//             if (handle.IsDone)
//             {
//                 if (onComplete != null)
//                 {
//                     onComplete(nameCaches[addressName].Result as T);
//                 }
//             }
//             else
//             {
//                 HandleAddCompleted<T>(addressName, handle, onComplete, onFailed);
//             }
//         }
//         else
//         {
//             var handle = Addressables.LoadAssetAsync<T>(addressName);
//             HandleAddCompleted<T>(addressName, handle, onComplete, onFailed);
//             nameCaches.Add(addressName, handle);
//         }
//     }
//
//     /// <summary>
//     /// 同步读取指定的Addressable类型的场景数据
//     /// </summary>
//     public async Task<SceneInstance> LoadSceneAsync(string sceneName, LoadSceneMode mode, Action completeCallBack = null,
//         bool isActiveOnLoaded = true, int priority = 100)
//     {
//         var handle = Addressables.LoadSceneAsync(sceneName, mode, isActiveOnLoaded, priority);
//
//         var res = await handle.Task;
//
//         completeCallBack?.Invoke();
//
//         return res;
//     }
//
//     /// <summary>
//     ///  读取指定的Addressable类型的名字或标签数据的集合
//     /// </summary>
//     /// <param name="address">名字</param>
//     /// <param name="onComplete">单个执行成功的回调</param>
//     /// <param name="allOnComplete">全部执行成功的回调</param>
//     /// <param name="onFailed">执行失败的回调</param>
//     /// <typeparam name="T"></typeparam>
//     public void LoadTagAsset<T>(string addressTag, Action<T> onComplete, Action<T> allOnComplete,
//         Action onFailed = null) where T : UnityEngine.Object
//     {
//         if (nameCaches.ContainsKey(addressTag))
//         {
//             var handle = this.nameCaches[addressTag];
//             if (handle.IsDone)
//             {
//                 if (onComplete != null)
//                 {
//                     onComplete(nameCaches[addressTag].Result as T);
//                 }
//             }
//             else
//             {
//                 HandleAddCompleted(addressTag, handle, allOnComplete, onFailed);
//             }
//         }
//         else
//         {
//             var handle = Addressables.LoadAssetsAsync(addressTag, onComplete);
//             AddTagCompleted(addressTag, handle, allOnComplete, onFailed);
//             nameCaches.Add(addressTag, handle);
//         }
//     }
//
//     private void AddTagCompleted<T>(string addressTag, AsyncOperationHandle handle, Action<T> allOnComplete,
//         Action onFailed = null) where T : UnityEngine.Object
//     {
//         handle.Completed += (result) =>
//         {
//             if (result.Status == AsyncOperationStatus.Succeeded)
//             {
//                 var obj = result.Result as T;
//                 if (allOnComplete != null)
//                 {
//                     allOnComplete(obj);
//                 }
//             }
//             else
//             {
//                 if (onFailed != null)
//                 {
//                     onFailed();
//                 }
//
//                 Debug.LogErrorFormat("读取地址为-【{0}】-的ab包资源失败!", addressTag);
//             }
//         };
//     }
//
//     private void HandleAddCompleted<T>(string addressName, AsyncOperationHandle handle, Action<T> onComplete,
//         Action onFailed = null) where T : UnityEngine.Object
//     {
//         handle.Completed += (result) =>
//         {
//             if (result.Status == AsyncOperationStatus.Succeeded)
//             {
//                 var obj = result.Result as T;
//                 if (onComplete != null)
//                 {
//                     onComplete(obj);
//                 }
//             }
//             else
//             {
//                 if (onFailed != null)
//                 {
//                     onFailed();
//                 }
//
//                 Debug.LogErrorFormat("读取地址为-【{0}】-的ab包资源失败!", addressName);
//             }
//         };
//     }
//
//     private void LoadRelease(string name)
//     {
//         if (nameCaches.ContainsKey(name))
//         {
//             Addressables.Release(nameCaches[name]);
//             nameCaches.Remove(name);
//         }
//     }
//
//     private void OnDestroy()
//     {
//         for (int i = 0; i < nameCaches.Count; i++)
//         {
//             KeyValuePair<string, AsyncOperationHandle> kv = nameCaches.ElementAt(i);
//             LoadRelease(kv.Key);
//         }
//     }
// }