183 lines
6.5 KiB
C#
Raw 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_AOT : Base
{
static YooAssetManager_AOT m_instance;
public static YooAssetManager_AOT instance
{
get
{
if (m_instance == null)
m_instance = new YooAssetManager_AOT();
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);
await handle.Task;
if (handle.Status == EOperationStatus.Succeed)
return handle.AssetObject as TObject;
else throw new Exception($"{path} 加载失败:{handle.LastError}");
}
/// <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_AOT.instance.onStart != null)
await YooAssetManager_AOT.instance.onStart.Invoke();
YooAssetManager_AOT.instance.isFinish = true;
YooAssetManager_AOT.instance.onFinish?.Invoke();
});
}
private static async UniTask ToDownLoadNext(EPlayMode playMode, Action onFinish)
{
if (downloadIndex >= AppConst_AOT.yoo_Package_Info.packages.Count)
{
LogGreen($"跳过更新 {downloadIndex} {AppConst_AOT.yoo_Package_Info.packages.Count}");
onFinish();
return;
}
var package = AppConst_AOT.yoo_Package_Info.packages[downloadIndex];
LogGreen($"开始更新 {package} ");
// 开始补丁更新流程
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.Additive, LocalPhysicsMode.None);
await handle.Task;
handle.ActivateScene();
//SceneManager.SetActiveScene(handle.SceneObject);
await UniTask.Delay(50);
await SceneManager.UnloadSceneAsync("gameStart");
// 卸载当前场景
//string curName = SceneManager.GetActiveScene().name;
//await SceneManager.UnloadSceneAsync(scenePath);
}
//public static async UniTask ChangeScene_Des(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);
//}
//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
}
}