using UnityEngine; using System.Collections; using System.Collections.Generic; using Cysharp.Threading.Tasks; using System; using YooAsset; #if UNITY_EDITOR using UnityEditor; #endif public class ResManager : Singleton { private string defaultPackageName = "UI"; private List> prewarmGOResources = new List>(){ new KeyValuePair("UI", "MainWin"), new KeyValuePair("Prefab", "Battle/BattleCamera"), new KeyValuePair("Prefab", "Place/PlaceCamera"), }; private bool isInitialized = false; private string assetVersion = "1.0.0"; public async UniTask Init() { Debug.Log("[ResManager] 开始初始化"); if (Launch.Instance.IsUseAssetBundle && !isInitialized) { // 初始化 YooAsset Debug.Log("[ResManager] 初始化 YooAsset"); YooAssets.Initialize(); // 创建默认的资源包 Debug.Log($"[ResManager] 开始创建默认资源包: {defaultPackageName}"); var package = await CreatePackage(defaultPackageName); // 设置该资源包为默认的资源包,可以使用YooAssets相关加载接口加载该资源包内容 Debug.Log("[ResManager] 设置默认资源包"); YooAssets.SetDefaultPackage(package); isInitialized = true; Debug.Log("[ResManager] 初始化完成"); } else { Debug.Log("[ResManager] 跳过初始化: IsUseAssetBundle=" + Launch.Instance.IsUseAssetBundle + ", isInitialized=" + isInitialized); } await UniTask.CompletedTask; } protected async UniTask CreatePackage(string packageName) { Debug.Log($"[ResManager] 创建资源包: {packageName}"); ResourcePackage package = YooAssets.CreatePackage(packageName); var parameters = new OfflinePlayModeParameters(); string builtinPath = $"E:/ProjSG/Bundles/StandaloneWindows64/{packageName}/{assetVersion}/"; Debug.Log($"[ResManager] 资源包路径: {builtinPath}"); parameters.BuildinFileSystemParameters = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(null, builtinPath); Debug.Log($"[ResManager] 开始初始化资源包: {packageName}"); var operation = package.InitializeAsync(parameters); await operation; Debug.Log($"[ResManager] 资源包初始化完成: {packageName}, 状态: {operation.Status}"); Debug.Log($"[ResManager] 请求资源包版本: {packageName}"); await package.RequestPackageVersionAsync(); Debug.Log($"[ResManager] 更新资源包清单: {packageName}, 版本: {assetVersion}"); await package.UpdatePackageManifestAsync(assetVersion); if (operation.Status == EOperationStatus.Succeed) { Debug.Log($"[ResManager] YooAsset package: {packageName} 成功"); } else { Debug.LogError($"[ResManager] YooAsset package: {operation.Error} 失败"); } return package; } public async UniTask LoadAsset(string packageName, string assetName) where T : UnityEngine.Object { Debug.Log($"[ResManager] 异步加载资源: {packageName}/{assetName}, 类型: {typeof(T).Name}"); T retAsset = null; if (Launch.Instance.IsUseAssetBundle) { ResourcePackage package = YooAssets.TryGetPackage(packageName); if (package == null) { Debug.Log($"[ResManager] 资源包不存在,创建新包: {packageName}"); package = await CreatePackage(packageName); } string path = $"Assets/ResourcesOut/{packageName}/{assetName}"; var operation = package.LoadAssetAsync(path); await operation; if (operation.Status == EOperationStatus.Succeed) { retAsset = operation.AssetObject as T; Debug.Log($"[ResManager] 异步加载成功: {packageName}/{assetName}"); } else { retAsset = null; Debug.LogError($"[ResManager] 异步加载资源失败: {packageName}/{assetName}, 错误: {operation.LastError}"); } } else { Debug.Log($"[ResManager] 编辑器模式加载资源: {packageName}/{assetName}"); retAsset = EditorLoadAsset(packageName, assetName); } Debug.Log($"[ResManager] 资源加载结果: {(retAsset != null ? "成功" : "失败")}"); return retAsset; } private T EditorLoadAsset(string packageName, string assetName) where T : UnityEngine.Object { Debug.Log($"[ResManager] 编辑器加载资源: {packageName}/{assetName}, 类型: {typeof(T).Name}"); T retAsset = null; #if UNITY_EDITOR string path = $"Assets/ResourcesOut/{packageName}/{assetName}."; var tp = typeof(T); if (tp == typeof(GameObject)) { path += "prefab"; } else if (tp == typeof(Material)) { path += "mat"; } else if (tp == typeof(Texture2D)) { path += "png"; } else if (tp == typeof(Shader)) { path += "shader"; } else if (tp == typeof(Sprite)) { path += "png"; } else if (tp == typeof(TextAsset)) { path += ".txt"; } Debug.Log($"[ResManager] 编辑器加载路径: {path}"); retAsset = AssetDatabase.LoadAssetAtPath(path); Debug.Log($"[ResManager] 编辑器加载结果: {(retAsset != null ? "成功" : "失败")}"); #endif return retAsset; } public T LoadAssetSync(string packageName, string assetName) where T : UnityEngine.Object { Debug.Log($"[ResManager] 同步加载资源: {packageName}/{assetName}, 类型: {typeof(T).Name}"); T retAsset = null; if (Launch.Instance.IsUseAssetBundle) { if (!isInitialized) { Debug.LogWarning("[ResManager] 资源管理器未初始化,无法加载资源"); return null; } ResourcePackage package = YooAssets.TryGetPackage(packageName); if (package == null) { Debug.LogWarning($"[ResManager] 资源包不存在: {packageName}"); return null; } Debug.Log($"[ResManager] 开始同步加载: {packageName}/{assetName}"); string path = $"Assets/ResourcesOut/{packageName}/{assetName}"; Debug.Log($"[ResManager] 资源路径: {path}"); var handle = package.LoadAssetSync(path); if (handle.Status == EOperationStatus.Succeed) { retAsset = handle.AssetObject as T; Debug.Log($"[ResManager] 同步加载成功: {packageName}/{assetName}"); } else { Debug.LogError($"[ResManager] 加载资源失败: {packageName}/{assetName}, 错误: {handle.LastError}"); } } else { Debug.Log($"[ResManager] 编辑器模式同步加载: {packageName}/{assetName}"); retAsset = EditorLoadAsset(packageName, assetName); } Debug.Log($"[ResManager] 同步加载结果: {(retAsset != null ? "成功" : "失败")}"); return retAsset; } public GameObject LoadUI(string uiName) { Debug.Log($"[ResManager] 加载UI: {uiName}"); var result = LoadAssetSync("UI", uiName); Debug.Log($"[ResManager] UI加载结果: {(result != null ? "成功" : "失败")}"); return result; } public async UniTask PrewarmResources() { Debug.Log("[ResManager] 开始预热资源"); // 预热常用资源 if (Launch.Instance.IsUseAssetBundle) { // 可以在这里预加载常用的资源 foreach (var item in prewarmGOResources) { Debug.Log($"[ResManager] 预热资源: {item.Key}/{item.Value}"); await LoadAsset(item.Key, item.Value); } Debug.Log("[ResManager] 预热资源完成"); } else { Debug.Log("[ResManager] 编辑器模式跳过资源预热"); } } }