2025-06-07 17:43:34 +08:00

183 lines
6.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}
}