using Cysharp.Threading.Tasks; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using YooAsset; namespace AOT { /// /// Addressable的资源管理器(只用于启动游戏时更新) /// 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 onStart; public bool isFinish = false; public Action onFinish; private static byte downloadIndex = 0; PatchOperation operation; #region InnerClass [Serializable] private class DownloadContent { public List catalogs = new List(); } #endregion #region FieldsAndProperties //记录在playerPres里的需要下载的catalogs的ID const string DOWNLOAD_CATALOGS_ID = "DownloadCatalogs"; #endregion #region API public static async UniTask LoadAssetHandle(string path) where TObject : UnityEngine.Object { Debug.Log("####### YooAssets.LoadAssetAsync T = " + typeof(TObject) + " path = " + path); //return await Addressables.LoadAssetAsync(path); AssetHandle handle = YooAssets.LoadAssetAsync(path); await handle.Task; if (handle.Status == EOperationStatus.Succeed) return handle; else throw new Exception($"{path} 加载失败:{handle.LastError}"); } public static async UniTask LoadAsset(string path) where TObject : UnityEngine.Object { Debug.Log("####### YooAssets.LoadAssetAsync T = " + typeof(TObject) + " path = " + path); //return await Addressables.LoadAssetAsync(path); AssetHandle handle = YooAssets.LoadAssetAsync(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 LoadAssembliesAsset(string path) where TObject : UnityEngine.Object { Debug.Log("####### YooAssets.LoadAssetAsync T = " + typeof(TObject) + " path = " + path); //return await Addressables.LoadAssetAsync(path); var scriptPackage = YooAssets.GetPackage("ScriptPackage"); AssetHandle handle = scriptPackage.LoadAssetAsync(path, 0); await handle.Task; if (handle.Status == EOperationStatus.Succeed) return handle.AssetObject as TObject; else throw new Exception($"{path} 加载失败:{handle.LastError}"); } /// /// YooAsset 初始化流程(初始化、热更新、释放) /// /// 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 } }