using Cysharp.Threading.Tasks; using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using YooAsset; namespace ET { public static class YooAssetProxy { public enum YooAssetResType { Unit, Config, DataConfig, SkillConfig, Scene, Code, Effect, Shader, Material, Sound, PathFind, } #region 路径相关 /// /// 获取YooAsset能识别的资源名 /// /// public static string GetYooAssetFormatResPath(string rawResName, YooAssetResType yooAssetResType) { return $"{yooAssetResType}_{rawResName}"; } #endregion #region Extension public static T GetAsset(this AssetOperationHandle assetOperationHandle) where T : UnityEngine.Object { return assetOperationHandle.GetAssetObject(); } public static T GetSubAsset(this SubAssetsOperationHandle assetOperationHandle, string subAssetName) where T : UnityEngine.Object { return assetOperationHandle.GetSubAssetObject(subAssetName); } public static byte[] GetRawBytes(this RawFileOperation rawFileOperation) { return rawFileOperation.LoadFileData(); } public static string GetRawString(this RawFileOperation rawFileOperation) { return rawFileOperation.LoadFileText(); } #endregion #region API public static async UniTask LoadAssetAsync(string path) where T : UnityEngine.Object { AssetOperationHandle assetOperationHandle = YooAssets.LoadAssetAsync(path); await assetOperationHandle.ToUniTask(); return assetOperationHandle; } public static async UniTask LoadSubAssetsAsync(string mainAssetPath, string subAssetName) where T : UnityEngine.Object { SubAssetsOperationHandle subAssetsOperationHandle = YooAssets.LoadSubAssetsAsync(mainAssetPath); await subAssetsOperationHandle.ToUniTask(); return subAssetsOperationHandle; } public static async UniTask LoadSceneAsync(string scenePath, LoadSceneMode loadSceneMode = LoadSceneMode.Single) { SceneOperationHandle sceneOperationHandle = YooAssets.LoadSceneAsync(scenePath, loadSceneMode, true); await sceneOperationHandle.ToUniTask(); return sceneOperationHandle; } public static async UniTask GetRawFileAsync(string path) { RawFileOperation rawFileOperation = YooAssets.GetRawFileAsync(path); await rawFileOperation.ToUniTask(); return rawFileOperation; } public static void UnloadUnusedAssets() { YooAssets.UnloadUnusedAssets(); } public static List GetAssetPathsByTag(string tag) { AssetInfo[] assetInfos = YooAssets.GetAssetInfos(tag); List result = new List(16); foreach (var assetInfo in assetInfos) { result.Add(assetInfo.Address); } return result; } public static void InitHostCallbacks(Action onStateUpdate, Action onDownLoadProgressUpdate) { PatchUpdater.InitCallback(onStateUpdate, onDownLoadProgressUpdate); } public static UniTask StartYooAssetEngine(YooAssets.EPlayMode playMode) { UniTaskCompletionSource uniTaskCompletionSource = new UniTaskCompletionSource(); // 编辑器下的模拟模式 if (playMode == YooAssets.EPlayMode.EditorSimulateMode) { var createParameters = new YooAssets.EditorSimulateModeParameters(); createParameters.LocationServices = new AddressLocationServices(); YooAssets.InitializeAsync(createParameters).Completed += _ => { uniTaskCompletionSource.TrySetResult(); }; } // 单机运行模式 if (playMode == YooAssets.EPlayMode.OfflinePlayMode) { var createParameters = new YooAssets.OfflinePlayModeParameters(); createParameters.LocationServices = new AddressLocationServices(); YooAssets.InitializeAsync(createParameters).Completed += _ => { uniTaskCompletionSource.TrySetResult(); }; } // 联机运行模式 if (playMode == YooAssets.EPlayMode.HostPlayMode) { var globalConfig = Resources.Load("GlobalConfig"); var createParameters = new YooAssets.HostPlayModeParameters(); createParameters.LocationServices = new AddressLocationServices(); createParameters.DecryptionServices = null; createParameters.ClearCacheWhenDirty = false; var hostServer = GetHostServerURL(); createParameters.DefaultHostServer = hostServer; //作为DefaultHostServer的备份 createParameters.FallbackHostServer = hostServer; //设置大于1Mb的资源支持断点续传 createParameters.BreakpointResumeFileSize = 1 * 1014 * 1024; string GetHostServerURL() { string hostServerIP = globalConfig.HotfixResUrl; string gameVersion = globalConfig.Version; #if UNITY_EDITOR if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.Android) return $"{hostServerIP}/android/{gameVersion}"; else if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.iOS) return $"{hostServerIP}/ios/{gameVersion}"; else if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.WebGL) return $"{hostServerIP}/web/{gameVersion}"; else return $"{hostServerIP}/pc/{gameVersion}"; #else if (Application.platform == RuntimePlatform.Android) return $"{hostServerIP}/android/{gameVersion}"; else if (Application.platform == RuntimePlatform.IPhonePlayer) return $"{hostServerIP}/ios/{gameVersion}"; else if (Application.platform == RuntimePlatform.WebGLPlayer) return $"{hostServerIP}/web/{gameVersion}"; else return $"{hostServerIP}/pc/{gameVersion}"; #endif } // 如果是资源热更模式,则需要等待热更完毕后再Invoke回调 YooAssets.InitializeAsync(createParameters).Completed += _ => { // 运行补丁流程 PatchUpdater.Run(uniTaskCompletionSource); }; } return uniTaskCompletionSource.Task; } #endregion } }