171 lines
6.0 KiB
C#
171 lines
6.0 KiB
C#
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
|
||
}
|
||
} |