145 lines
4.3 KiB
C#
145 lines
4.3 KiB
C#
|
using System;
|
|||
|
using Cysharp.Threading.Tasks;
|
|||
|
using PhxhSDK.Res;
|
|||
|
using UnityEngine;
|
|||
|
using YooAsset;
|
|||
|
using Object = UnityEngine.Object;
|
|||
|
|
|||
|
namespace PhxhSDK
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 提供统一的资源管理
|
|||
|
/// 注意,此类型中的API都要成对使用,每一次load(如preload,load,loadAsync)都要对应一次unload!
|
|||
|
/// </summary>
|
|||
|
public class AssetManager : Singlenton<AssetManager>
|
|||
|
{
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 预加载,不需要资源的时候一定要调用<see cref="Unload"/>,
|
|||
|
/// 获取预加载的资源请调用<see cref="GetPreLoadResult{T}"/>,不能使用<see cref="LoadAsset{T}"/>或者<see cref="LoadAssetAsync{T}"/>,会产生多次引用计数
|
|||
|
/// </summary>
|
|||
|
/// <param name="path"></param>
|
|||
|
/// <typeparam name="T"></typeparam>
|
|||
|
public async UniTask PostPreload<T>(string path) where T : Object
|
|||
|
{
|
|||
|
await _resLoader.PostPreload<T>(path);
|
|||
|
}
|
|||
|
|
|||
|
public void PostPreload(string path)
|
|||
|
{
|
|||
|
PostPreload<Object>(path).Forget();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 获取预加载的结果
|
|||
|
/// </summary>
|
|||
|
/// <param name="path"></param>
|
|||
|
/// <typeparam name="T"></typeparam>
|
|||
|
/// <returns></returns>
|
|||
|
public T GetPreLoadResult<T>(string path) where T : Object
|
|||
|
{
|
|||
|
return _resLoader.GetPreLoadResult<T>(path);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 等待所有预加载结束
|
|||
|
/// </summary>
|
|||
|
public async UniTask WaitAllPreloads()
|
|||
|
{
|
|||
|
await _resLoader.WaitAllPreloads();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 同步加载资源,不需要资源的时候请调用<see cref="Unload"/>
|
|||
|
/// </summary>
|
|||
|
/// <param name="path"></param>
|
|||
|
/// <typeparam name="T"></typeparam>
|
|||
|
/// <returns></returns>
|
|||
|
public T LoadAsset<T>(string path) where T : Object
|
|||
|
{
|
|||
|
LoadAssetAsync<T>(path).Forget();
|
|||
|
return _resLoader.GetPreLoadResult<T>(path);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 异步加载资源,不需要资源的时候请调用<see cref="Unload"/>
|
|||
|
/// </summary>
|
|||
|
/// <param name="path">路径</param>
|
|||
|
/// <param name="onLoaded">加载完成后的回调</param>
|
|||
|
/// <typeparam name="T">资源类型</typeparam>
|
|||
|
/// <returns></returns>
|
|||
|
public async UniTask<T> LoadAssetAsync<T>(string path, Action<T> onLoaded = null) where T : Object
|
|||
|
{
|
|||
|
while (!isInited)
|
|||
|
{
|
|||
|
await UniTask.Delay(10);
|
|||
|
}
|
|||
|
return await _resLoader.LoadAsync<T>(path, onLoaded);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 同步加载原生文件
|
|||
|
/// </summary>
|
|||
|
/// <param name="lacation"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public RawFileHandle LoadRawFileAsync(string lacation)
|
|||
|
{
|
|||
|
return _resLoader.LoadRawFileAsync(lacation);
|
|||
|
}
|
|||
|
|
|||
|
public void Unload(string path, bool force = false)
|
|||
|
{
|
|||
|
_resLoader.Unload(path, force);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 路径是否存在
|
|||
|
/// </summary>
|
|||
|
/// <param name="path">路径</param>
|
|||
|
/// <param name="location">资源的location</param>
|
|||
|
/// <typeparam name="T"></typeparam>
|
|||
|
/// <returns></returns>
|
|||
|
public bool CanLocateAsset<T>(string path) where T : UnityEngine.Object
|
|||
|
{
|
|||
|
return _resLoader.CanLocate<T>(path);
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|