171 lines
6.0 KiB
C#
Raw Permalink Normal View History

2025-06-07 17:43:34 +08:00
using Cysharp.Threading.Tasks;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using YooAsset;
namespace AOT
{
/// <summary>
/// Addressable的资源管理器只用于启动游戏时更新
/// </summary>
public class YooAssetManager : Base
{
static YooAssetManager m_instance;
public static YooAssetManager instance
{
get
{
if (m_instance == null)
m_instance = new YooAssetManager();
return m_instance;
}
}
public Func<UniTask> onStart;
public bool isFinish = false;
public Action onFinish;
private static byte downloadIndex = 0;
PatchOperation operation;
#region InnerClass
[Serializable]
private class DownloadContent
{
public List<string> catalogs = new List<string>();
}
#endregion
#region FieldsAndProperties
//记录在playerPres里的需要下载的catalogs的ID
const string DOWNLOAD_CATALOGS_ID = "DownloadCatalogs";
#endregion
#region API
public static async UniTask<AssetHandle> LoadAssetHandle<TObject>(string path) where TObject : UnityEngine.Object
{
Debug.Log("####### YooAssets.LoadAssetAsync T = " + typeof(TObject) + " path = " + path);
//return await Addressables.LoadAssetAsync<TObject>(path);
AssetHandle handle = YooAssets.LoadAssetAsync<TObject>(path);
await handle.Task;
if (handle.Status == EOperationStatus.Succeed)
return handle;
else throw new Exception($"{path} 加载失败:{handle.LastError}");
}
public static async UniTask<TObject> LoadAsset<TObject>(string path) where TObject : UnityEngine.Object
{
Debug.Log("####### YooAssets.LoadAssetAsync T = " + typeof(TObject) + " path = " + path);
//return await Addressables.LoadAssetAsync<TObject>(path);
AssetHandle handle = YooAssets.LoadAssetAsync<TObject>(path);
await handle.Task;
if (handle.Status == EOperationStatus.Succeed)
return handle.AssetObject as TObject;
else throw new Exception($"{path} 加载失败:{handle.LastError}");
}
public static async UniTask<TObject> LoadAssembliesAsset<TObject>(string path) where TObject : UnityEngine.Object
{
Debug.Log("####### YooAssets.LoadAssetAsync T = " + typeof(TObject) + " path = " + path);
//return await Addressables.LoadAssetAsync<TObject>(path);
var scriptPackage = YooAssets.GetPackage("ScriptPackage");
AssetHandle handle = scriptPackage.LoadAssetAsync<TObject>(path, 0);
//AssetHandle handle = YooAssets.LoadAssetAsync<TObject>(path);
await handle.Task;
if (handle.Status == EOperationStatus.Succeed)
return handle.AssetObject as TObject;
else throw new Exception($"{path} 加载失败:{handle.LastError}");
}
//public void UnloadAsset(UnityEngine.Object asset)
//{
// if (asset != null)
// Addressables.Release(asset);
//}
/// <summary>
/// YooAsset 初始化流程(初始化、热更新、释放)
/// </summary>
/// <returns></returns>
public static async UniTask YooInit(EPlayMode playMode)
{
// 初始化资源系统
YooAssets.Initialize();
//Debug.Log("AAAAAAA#### " + Application.persistentDataPath);
// 开始补丁更新流程
await ToDownLoadNext(playMode, async () =>
{
// 设置默认的资源包
var gamePackage = YooAssets.GetPackage("DefaultPackage");
YooAssets.SetDefaultPackage(gamePackage);
if (YooAssetManager.instance.onStart != null)
await YooAssetManager.instance.onStart.Invoke();
YooAssetManager.instance.isFinish = true;
YooAssetManager.instance.onFinish?.Invoke();
});
}
private static async UniTask ToDownLoadNext(EPlayMode playMode, Action onFinish)
{
if (downloadIndex >= AppConst_AOT.yoo_Package_Info.packages.Count)
{
onFinish();
return;
}
var package = AppConst_AOT.yoo_Package_Info.packages[downloadIndex];
Log($"<color=blue>开始更新 {package} </color>");
// 开始补丁更新流程
instance.operation = new PatchOperation(package.name, package.version, package.isBuildinFileSystem, playMode);
YooAssets.StartOperation(instance.operation);
await instance.operation.Task;
downloadIndex++;
await ToDownLoadNext(playMode, onFinish);
}
public static async UniTask ChangeScene(string scenePath)
{
//string curName = SceneManager.GetActiveScene().name;
//bool suspendLoad = false;
SceneHandle handle = YooAssets.LoadSceneAsync(scenePath, LoadSceneMode.Single, LocalPhysicsMode.None);
await handle.Task;
handle.ActivateScene();
SceneManager.SetActiveScene(handle.SceneObject);
// 卸载当前场景
//string curName = SceneManager.GetActiveScene().name;
//await SceneManager.UnloadSceneAsync(scenePath);
}
public static IEnumerator ChangeScene()
{
const string START_SCENE_NAME = "Assets/Art/Scenes/main.unity";
var sceneMode = UnityEngine.SceneManagement.LoadSceneMode.Additive;
//var physicsMode = LocalPhysicsMode.None;
SceneHandle handle = YooAssets.LoadSceneAsync(START_SCENE_NAME, sceneMode, LocalPhysicsMode.None);
yield return handle;
Debug.Log($"Scene name is {handle.SceneObject.name}");
}
#endregion
}
}