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 : Base { static YooAssetManager m_instance; public static YooAssetManager instance { get { if (m_instance == null) m_instance = new YooAssetManager(); 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); //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 void UnloadAsset(UnityEngine.Object asset) //{ // if (asset != null) // Addressables.Release(asset); //} /// /// 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.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($"开始更新 :{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.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 } }