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

171 lines
6.0 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 : 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
}
}