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<ResManager>
|
{
|
private string defaultPackageName = "UI";
|
|
private List<KeyValuePair<string, string>> prewarmGOResources = new List<KeyValuePair<string, string>>(){
|
new KeyValuePair<string, string>("UI", "MainWin"),
|
new KeyValuePair<string, string>("Prefab", "Battle/BattleCamera"),
|
new KeyValuePair<string, string>("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<ResourcePackage> 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<T> LoadAsset<T>(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<T>(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<T>(packageName, assetName);
|
}
|
|
Debug.Log($"[ResManager] 资源加载结果: {(retAsset != null ? "成功" : "失败")}");
|
return retAsset;
|
}
|
|
private T EditorLoadAsset<T>(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<T>(path);
|
Debug.Log($"[ResManager] 编辑器加载结果: {(retAsset != null ? "成功" : "失败")}");
|
#endif
|
|
return retAsset;
|
}
|
|
public T LoadAssetSync<T>(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<GameObject>(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<T>(packageName, assetName);
|
}
|
|
Debug.Log($"[ResManager] 同步加载结果: {(retAsset != null ? "成功" : "失败")}");
|
return retAsset;
|
}
|
|
public GameObject LoadUI(string uiName)
|
{
|
Debug.Log($"[ResManager] 加载UI: {uiName}");
|
var result = LoadAssetSync<GameObject>("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<GameObject>(item.Key, item.Value);
|
}
|
|
Debug.Log("[ResManager] 预热资源完成");
|
}
|
else
|
{
|
Debug.Log("[ResManager] 编辑器模式跳过资源预热");
|
}
|
}
|
}
|