using Cysharp.Threading.Tasks;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.SceneManagement;
using YooAsset;
public class YooAssetManager : MonoBehaviour
{
public static YooAssetManager Instance { get; private set; }
/// 资源包
public ResourcePackage package;
/// Asset句柄
public Dictionary handles = new Dictionary();
/// AllAsset句柄
public DictionaryallHandles=new Dictionary();
/// SceneAsset句柄
public Dictionary sceneHandles = new Dictionary();
private void Awake()
{
Instance = this;
package = YooAssets.GetPackage("DefaultPackage");
//await this.gameObject.AddComponent().InitYooAsset();
//package = YooAssets.GetPackage("DefaultPackage");
//var ui = await LoadAsset("DlgFaceBuildUI");
//var go =GameObject.Instantiate(ui);
//go.transform.SetParent(GameObject.Find("Canvas").transform);
//go.transform.localPosition = Vector3.zero;
}
///
/// 加载资源
///
///
///
///
public async UniTask LoadAsset(string location) where T : Object
{
AssetHandle handler;
if (!handles.TryGetValue(location,out handler))
{
handler = package.LoadAssetAsync(location);
await handler.Task;
handles.Add(location, handler);
}
return (T)((AssetHandle)handler).AssetObject;
}
///
/// 加载所有资源
///
///
///
///
public async UniTask> LoadAllAsset(string location) where T : Object
{
AllAssetsHandle handler;
if (!allHandles.TryGetValue(location, out handler))
{
handler = package.LoadAllAssetsAsync(location);
await handler.Task;
allHandles.Add(location, handler);
}
Dictionary dictionary = new Dictionary();
foreach (UnityEngine.Object assetObj in ((AllAssetsHandle)handler).AllAssetObjects)
{
T t = assetObj as T;
dictionary.Add(t.name, t);
}
return dictionary;
}
///
/// 加载场景
///
///
///
public async UniTask LoadScene(string location)
{
if (handles.ContainsKey(location))
return;
bool activeOnLoad = true;
SceneHandle handle = package.LoadSceneAsync(location, LoadSceneMode.Additive, activeOnLoad);
ScenesManager.Instance.handle = handle;
sceneHandles.Add(location, handle);
await handle.Task;
}
public async UniTask ActivateScene(SceneHandle handle)
{
if (handle.Progress >= 0.9)
{
handle.ActivateScene();
await handle.Task;
}
}
}