三国卡牌客户端基础资源仓库
yyl
2025-05-13 346ca3658a3a2c6c48a7ca2f11bdf03ee59ffc11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
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] 编辑器模式跳过资源预热");
        }
    }
}