using System; using Cysharp.Threading.Tasks; using PhxhSDK.Res; using UnityEngine; using YooAsset; using Object = UnityEngine.Object; namespace PhxhSDK { /// /// 提供统一的资源管理 /// 注意,此类型中的API都要成对使用,每一次load(如preload,load,loadAsync)都要对应一次unload! /// public class AssetManager : Singlenton { private IResLoader _resLoader; public bool isInited; public AssetManager() { #if UNITY_EDITOR if (!Application.isPlaying) { // 没有运行的时候,使用假的加载器 _resLoader = new ResLoader_Fake(); _Init(); return; } #endif #if USE_YOO _resLoader = new ResLoader_YooAsset(); #else _resLoader = new ResLoader_Addressables(); #endif _Init(); } private async void _Init() { isInited = false; await _resLoader.Init(); isInited = true; } #region API /// /// 预加载,不需要资源的时候一定要调用, /// 获取预加载的资源请调用,不能使用或者,会产生多次引用计数 /// /// /// public async UniTask PostPreload(string path) where T : Object { await _resLoader.PostPreload(path); } public void PostPreload(string path) { PostPreload(path).Forget(); } /// /// 获取预加载的结果 /// /// /// /// public T GetPreLoadResult(string path) where T : Object { return _resLoader.GetPreLoadResult(path); } /// /// 等待所有预加载结束 /// public async UniTask WaitAllPreloads() { await _resLoader.WaitAllPreloads(); } /// /// 同步加载资源,不需要资源的时候请调用 /// /// /// /// public T LoadAsset(string path) where T : Object { LoadAssetAsync(path).Forget(); return _resLoader.GetPreLoadResult(path); } /// /// 异步加载资源,不需要资源的时候请调用 /// /// 路径 /// 加载完成后的回调 /// 资源类型 /// public async UniTask LoadAssetAsync(string path, Action onLoaded = null) where T : Object { while (!isInited) { await UniTask.Delay(10); } return await _resLoader.LoadAsync(path, onLoaded); } /// /// 同步加载原生文件 /// /// /// public RawFileHandle LoadRawFileAsync(string lacation) { return _resLoader.LoadRawFileAsync(lacation); } public void Unload(string path, bool force = false) { _resLoader.Unload(path, force); } /// /// 路径是否存在 /// /// 路径 /// 资源的location /// /// public bool CanLocateAsset(string path) where T : UnityEngine.Object { return _resLoader.CanLocate(path); } #endregion } }