183 lines
6.5 KiB
C#
183 lines
6.5 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_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
|
|||
|
}
|
|||
|
}
|