From 5667c0a5e6b83964e2538a17dcfd6b719692ddda Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期四, 12 二月 2026 11:11:34 +0800
Subject: [PATCH] 编辑器 模拟使用资源问题处理

---
 Main/ResModule/ResourcePreloader.cs             |    9 +-
 Main/Manager/StageManager.cs                    |    4 
 Main/ResModule/BuiltInLoader.cs                 |    6 +-
 Main/ResModule/YooAssetService.cs               |  111 ++++++++++++++++++++++++++++++++++++-
 Main/Core/GameEngine/Launch/YooAssetInitTask.cs |    5 +
 Main/ResModule/ResManager.cs                    |   36 +++++++-----
 Main/Utility/FontUtility.cs                     |    8 +-
 7 files changed, 147 insertions(+), 32 deletions(-)

diff --git a/Main/Core/GameEngine/Launch/YooAssetInitTask.cs b/Main/Core/GameEngine/Launch/YooAssetInitTask.cs
index a1f8d39..ad84d1a 100644
--- a/Main/Core/GameEngine/Launch/YooAssetInitTask.cs
+++ b/Main/Core/GameEngine/Launch/YooAssetInitTask.cs
@@ -48,7 +48,12 @@
             }
             else
             {
+#if UNITY_EDITOR
+                // 缂栬緫鍣ㄤ笅 AB 妯″紡浣跨敤 OfflinePlayMode锛堥殢鍖呮ā寮忥級锛屼粠 StreamingAssets 鍔犺浇
+                playMode = EPlayMode.OfflinePlayMode;
+#else
                 playMode = EPlayMode.HostPlayMode;
+#endif
             }
 
             // Initialize YooAssetService
diff --git a/Main/Manager/StageManager.cs b/Main/Manager/StageManager.cs
index 1f56223..fb9c542 100644
--- a/Main/Manager/StageManager.cs
+++ b/Main/Manager/StageManager.cs
@@ -46,7 +46,7 @@
         if (AssetSource.isUseAssetBundle)
         {
             loadingWin.SetProgress(0.05f);
-            await YooAssetService.Instance.LoadAllAssetsAsync<UnityEngine.Object>("Assets/ResourcesOut/maps/Login");
+            await YooAssetService.Instance.LoadAllAssetsAsync<UnityEngine.Object>("Assets/ResourcesOut/Scenes/Login");
             loadingWin.SetProgress(0.3f);
         }
 
@@ -144,7 +144,7 @@
         if (AssetSource.isUseAssetBundle)
         {
             loadingWin.SetProgress(0.05f);
-            await YooAssetService.Instance.LoadAllAssetsAsync<UnityEngine.Object>("Assets/ResourcesOut/maps/Game");
+            await YooAssetService.Instance.LoadAllAssetsAsync<UnityEngine.Object>("Assets/ResourcesOut/Scenes/Game");
             loadingWin.SetProgress(0.3f);
         }
 
diff --git a/Main/ResModule/BuiltInLoader.cs b/Main/ResModule/BuiltInLoader.cs
index 2c69c14..cf52f32 100644
--- a/Main/ResModule/BuiltInLoader.cs
+++ b/Main/ResModule/BuiltInLoader.cs
@@ -204,7 +204,7 @@
         {
 #if UNITY_EDITOR
             var path = StringUtility.Concat(ResourcesPath.ResourcesOutAssetPath,
-                                       "BuiltIn/Font/", fontName, ".ttf");
+                                       "Font/", fontName, ".ttf");
             font = UnityEditor.AssetDatabase.LoadAssetAtPath<Font>(path);
 #endif
         }
@@ -212,7 +212,7 @@
         {
             // US1: Route through YooAssetService sync wrapper
             var path = StringUtility.Concat(ResourcesPath.ResourcesOutAssetPath,
-                                       "BuiltIn/Font/", fontName, ".ttf");
+                                       "Font/", fontName, ".ttf");
             #pragma warning disable CS0612
             font = YooAssetService.Instance.LoadAssetSync<Font>(path);
             #pragma warning restore CS0612
@@ -270,7 +270,7 @@
     public static async UniTask<Font> LoadFontAsync(string fontName, CancellationToken ct = default)
     {
         var path = StringUtility.Concat(ResourcesPath.ResourcesOutAssetPath,
-                                       "BuiltIn/Font/", fontName, ".ttf");
+                                       "Font/", fontName, ".ttf");
         return await YooAssetService.Instance.LoadAssetAsync<Font>(path, ct: ct);
     }
 
diff --git a/Main/ResModule/ResManager.cs b/Main/ResModule/ResManager.cs
index bdf5de0..1e721fa 100644
--- a/Main/ResModule/ResManager.cs
+++ b/Main/ResModule/ResManager.cs
@@ -388,29 +388,35 @@
 
     /// <summary>
     /// 寮傛鍔犺浇閰嶇疆鏂囦欢锛圲niTask 鐗堟湰锛夈��
-    /// WebGL 骞冲彴浣跨敤 YooAsset RawFile 寮傛鍔犺浇锛屽叾浠栧钩鍙颁娇鐢ㄧ嚎绋嬫睜銆�
+    /// AB 妯″紡浣跨敤 YooAsset RawFile 寮傛鍔犺浇锛岄潪 AB 妯″紡鐩存帴璇绘枃浠躲��
     /// </summary>
     public async UniTask<string[]> LoadConfigAsync(string name, CancellationToken ct = default)
     {
-#if UNITY_WEBGL && !UNITY_EDITOR
-        // WebGL 涓嶆敮鎸佸绾跨▼鍜� File.ReadAllLines锛屼娇鐢� YooAsset RawFile
-        try
+        // AB 妯″紡锛堝惈 WebGL锛�: 浣跨敤 YooAsset RawFile 鍔犺浇锛堥厤缃枃浠跺湪 YooAsset 娌欑洅涓級
+        if (AssetSource.isUseAssetBundle)
         {
-            var text = await ProjSG.Resource.YooAssetService.Instance.LoadRawFileTextAsync($"config/{name}", ct);
-            if (!string.IsNullOrEmpty(text))
+            try
             {
-                return text.Split(new[] { "\r\n", "\n" }, System.StringSplitOptions.None);
+                var location = $"Assets/ResourcesOut/Config/{name}.txt";
+                var text = await ProjSG.Resource.YooAssetService.Instance.LoadRawFileTextAsync(location, ct);
+                if (!string.IsNullOrEmpty(text))
+                {
+                    return text.Split(new[] { "\r\n", "\n" }, System.StringSplitOptions.None);
+                }
             }
+            catch (System.Exception ex)
+            {
+                UnityEngine.Debug.LogError($"[ResManager] LoadConfigAsync YooAsset failed for '{name}': {ex.Message}");
+            }
+            return System.Array.Empty<string>();
         }
-        catch (System.Exception ex)
-        {
-            UnityEngine.Debug.LogError($"[ResManager] LoadConfigAsync WebGL fallback failed for '{name}': {ex.Message}");
-        }
-        return System.Array.Empty<string>();
+
+        // 闈� AB 妯″紡: 鐩存帴璇绘枃浠讹紙Editor 寮�鍙戞ā寮忥級
+#if UNITY_EDITOR
+        string path = ResourcesPath.CONFIG_FODLER + "/" + name + ".txt";
+        return await UniTask.RunOnThreadPool(() => File.ReadAllLines(path));
 #else
-        #pragma warning disable CS0618 // LoadConfig is obsolete 鈥� used here as thread-pool fallback for non-WebGL
-        return await UniTask.RunOnThreadPool(() => LoadConfig(name));
-        #pragma warning restore CS0618
+        return System.Array.Empty<string>();
 #endif
     }
 
diff --git a/Main/ResModule/ResourcePreloader.cs b/Main/ResModule/ResourcePreloader.cs
index 5bd635e..3c2900c 100644
--- a/Main/ResModule/ResourcePreloader.cs
+++ b/Main/ResModule/ResourcePreloader.cs
@@ -29,16 +29,15 @@
         public void RegisterDefaultConfigs()
         {
             // 鍚姩蹇呴渶璧勬簮锛堝父椹伙級
+            // 娉ㄦ剰锛氳矾寰勫繀椤绘槸鍏蜂綋鐨勮祫婧愭枃浠讹紙鍚墿灞曞悕鎴� YooAsset 鍙瘑鍒殑鏃犳墿灞曞悕璺緞锛夛紝
+            // 涓嶈兘鏄洰褰曡矾寰勩�係hader/Materials 绛夌洰褰曠骇鍔犺浇鐢� ShaderUtility 绛変笓鐢ㄧ郴缁熷鐞嗐��
             RegisterConfig(new PreloadConfig
             {
                 ConfigName = "StartupEssential",
                 Locations = new[]
                 {
-                    "Assets/ResourcesOut/Shader",                // Shader 鍏ㄩ儴
-                    "Assets/ResourcesOut/Materials",             // 閫氱敤 Material
-                    "Assets/ResourcesOut/BuiltIn/Font",          // 甯哥敤瀛椾綋
-                    "Assets/ResourcesOut/BuiltIn/UIRoot",        // UIRoot 棰勫埗浣�
-                    "Assets/ResourcesOut/BuiltIn/SoundPlayer",   // 闊抽鎾斁鍣�
+                    "Assets/ResourcesOut/BuiltIn/Prefabs/UIRoot.prefab",          // UIRoot 棰勫埗浣�
+                    "Assets/ResourcesOut/BuiltIn/Prefabs/SoundPlayer.prefab",     // 闊抽鎾斁鍣�
                 },
                 Tags = null,
                 IsPermanent = true,
diff --git a/Main/ResModule/YooAssetService.cs b/Main/ResModule/YooAssetService.cs
index beddec3..6fddd0d 100644
--- a/Main/ResModule/YooAssetService.cs
+++ b/Main/ResModule/YooAssetService.cs
@@ -70,7 +70,47 @@
                     var package = YooAssets.TryGetPackage(pkgName);
                     if (package != null)
                     {
-                        Debug.Log($"[YooAssetService] Reusing existing package '{pkgName}' from YooAssetInitializer");
+                        // 楠岃瘉鍖呰9鏄惁宸叉垚鍔熷垵濮嬪寲
+                        if (package.InitializeStatus == EOperationStatus.Succeed)
+                        {
+                            Debug.Log($"[YooAssetService] Reusing existing package '{pkgName}' (InitializeStatus=Succeed)");
+                        }
+                        else
+                        {
+                            // 鍖呰9瀛樺湪浣嗗垵濮嬪寲鏈畬鎴愭垨澶辫触锛堝兊灏稿寘瑁癸級
+                            // 閿�姣佸悗閲嶆柊鍒涘缓骞跺垵濮嬪寲
+                            Debug.LogWarning($"[YooAssetService] Package '{pkgName}' exists but InitializeStatus={package.InitializeStatus}, destroying and re-creating...");
+
+                            // 鏍规嵁鐘舵�佹竻鐞嗗兊灏稿寘瑁�
+                            if (package.InitializeStatus == EOperationStatus.None)
+                            {
+                                // 鏈垵濮嬪寲鐘舵�佸彲浠ョ洿鎺ョЩ闄�
+                                YooAssets.RemovePackage(pkgName);
+                            }
+                            else
+                            {
+                                // Failed/Processing 鐘舵�侀渶鍏堥攢姣佸啀绉婚櫎
+                                var destroyOp = package.DestroyAsync();
+                                await destroyOp.ToUniTask();
+                                YooAssets.RemovePackage(pkgName);
+                            }
+
+                            package = YooAssets.CreatePackage(pkgName);
+                            var initParams = CreateInitParameters(playMode, remoteServices, pkgName);
+                            var initOp = package.InitializeAsync(initParams);
+                            await initOp.ToUniTask();
+
+                            if (initOp.Status != EOperationStatus.Succeed)
+                            {
+                                Debug.LogWarning($"[YooAssetService] Package '{pkgName}' re-init failed: {initOp.Error}");
+                                continue;
+                            }
+
+                            Debug.Log($"[YooAssetService] Package '{pkgName}' re-initialized successfully.");
+
+                            // 閲嶆柊鍒濆鍖栧悗蹇呴』璇锋眰鐗堟湰骞舵洿鏂� Manifest
+                            await RequestVersionAndUpdateForPackageAsync(pkgName, package);
+                        }
                     }
                     else
                     {
@@ -85,6 +125,9 @@
                             Debug.LogWarning($"[YooAssetService] Package '{pkgName}' init failed: {initOp.Error}");
                             continue;
                         }
+
+                        // 鍒濆鍖栧悗蹇呴』璇锋眰鐗堟湰骞舵洿鏂� Manifest锛屽惁鍒� ActiveManifest 涓� null
+                        await RequestVersionAndUpdateForPackageAsync(pkgName, package);
 
                         Debug.Log($"[YooAssetService] Package '{pkgName}' newly initialized.");
                     }
@@ -112,7 +155,22 @@
             }
 
             _isInitialized = true;
-            Debug.Log($"[YooAssetService] Initialized {_packages.Count}/{YooAssetPackageConfig.AllPackages.Length} packages with PlayMode={playMode}");
+
+            // 杈撳嚭鍒濆鍖栨憳瑕� 鈥� 甯姪璇婃柇缂哄け鐨勫寘瑁�
+            var allPkgs = YooAssetPackageConfig.AllPackages;
+            var missingPkgs = new System.Collections.Generic.List<string>();
+            foreach (var p in allPkgs)
+            {
+                if (!_packages.ContainsKey(p))
+                    missingPkgs.Add(p);
+            }
+            if (missingPkgs.Count > 0)
+            {
+                Debug.LogError($"[YooAssetService] WARNING: {missingPkgs.Count} package(s) FAILED to initialize: [{string.Join(", ", missingPkgs)}]. " +
+                    $"Assets routed to these packages will fail to load! Check earlier console errors for SimulateBuild failures.");
+            }
+            Debug.Log($"[YooAssetService] Initialized {_packages.Count}/{allPkgs.Length} packages with PlayMode={playMode}. " +
+                $"Active: [{string.Join(", ", _packages.Keys)}]");
         }
 
         /// <summary>
@@ -129,6 +187,7 @@
 
             // 浼樺厛澶嶇敤宸插瓨鍦ㄧ殑鍖呰9锛堝彲鑳界敱 Launch 闃舵鍒涘缓锛�
             var package = YooAssets.TryGetPackage(packageName);
+            bool needManifest = false;
             if (package == null)
             {
                 package = YooAssets.CreatePackage(packageName);
@@ -141,9 +200,17 @@
                     Debug.LogError($"[YooAssetService] Initialize package '{packageName}' failed: {initOp.Error}");
                     throw new InvalidOperationException($"YooAsset package '{packageName}' initialization failed: {initOp.Error}");
                 }
+                needManifest = true;
             }
 
             _packages[packageName] = package;
+
+            // 纭繚 ActiveManifest 宸插姞杞�
+            if (needManifest)
+            {
+                await RequestVersionAndUpdateForPackageAsync(packageName, package);
+            }
+
             Debug.Log($"[YooAssetService] Package '{packageName}' initialized.");
         }
 
@@ -206,6 +273,40 @@
                 }
                 default:
                     throw new ArgumentOutOfRangeException(nameof(playMode), playMode, "Unsupported PlayMode.");
+            }
+        }
+
+        /// <summary>
+        /// 瀵瑰崟涓寘瑁规墽琛岀増鏈姹傚拰 Manifest 鏇存柊銆�
+        /// 鎵�鏈夎繍琛屾ā寮忥紙鍖呮嫭 EditorSimulateMode锛夐兘闇�瑕佹姝ラ鏉ュ~鍏� ActiveManifest銆�
+        /// </summary>
+        private async UniTask RequestVersionAndUpdateForPackageAsync(string pkgName, ResourcePackage package)
+        {
+            try
+            {
+                var versionOp = package.RequestPackageVersionAsync();
+                await versionOp.ToUniTask();
+
+                if (versionOp.Status != EOperationStatus.Succeed)
+                {
+                    Debug.LogWarning($"[YooAssetService] RequestPackageVersion failed for '{pkgName}': {versionOp.Error}");
+                    return;
+                }
+
+                var manifestOp = package.UpdatePackageManifestAsync(versionOp.PackageVersion);
+                await manifestOp.ToUniTask();
+
+                if (manifestOp.Status != EOperationStatus.Succeed)
+                {
+                    Debug.LogWarning($"[YooAssetService] UpdatePackageManifest failed for '{pkgName}': {manifestOp.Error}");
+                    return;
+                }
+
+                Debug.Log($"[YooAssetService] Package '{pkgName}' manifest loaded (version={versionOp.PackageVersion}).");
+            }
+            catch (Exception ex)
+            {
+                Debug.LogWarning($"[YooAssetService] RequestVersionAndUpdate for '{pkgName}' exception: {ex.Message}");
             }
         }
 
@@ -277,7 +378,11 @@
             if (_packages.TryGetValue(packageName, out var package))
                 return package;
 
-            // 璺敱鍒扮殑鍖呭皻鏈垵濮嬪寲锛屽洖閫�鍒伴粯璁ゅ寘
+            // 璺敱鍒扮殑鍖呭皻鏈垵濮嬪寲锛屽洖閫�鍒伴粯璁ゅ寘 鈥� 鍙戝嚭鏄庣‘璀﹀憡
+            Debug.LogWarning($"[YooAssetService] Package '{packageName}' not available for location '{location}'. " +
+                $"Available packages: [{string.Join(", ", _packages.Keys)}]. " +
+                $"Falling back to default package '{_defaultPackage?.PackageName ?? "NULL"}'." +
+                $"\n  鈫� This usually means SimulateBuild failed for '{packageName}'. Check earlier console errors.");
             return _defaultPackage;
         }
 
diff --git a/Main/Utility/FontUtility.cs b/Main/Utility/FontUtility.cs
index d612580..94bbdbf 100644
--- a/Main/Utility/FontUtility.cs
+++ b/Main/Utility/FontUtility.cs
@@ -7,17 +7,17 @@
 
 public class FontUtility
 {
-    // T044: Fonts must be pre-loaded via StartupEssential preload config
-    // (location: "Assets/ResourcesOut/BuiltIn/Font")
+    // T044: Fonts loaded via FontUtility.InitAsync or UILoader.LoadFont
+    // Actual location: Assets/ResourcesOut/Font/
 
     public static Font preferred
     {
-        get { return ResourceCacheManager.Instance.GetCached<Font>("Assets/ResourcesOut/BuiltIn/Font/GameFont1.ttf"); }
+        get { return ResourceCacheManager.Instance.GetCached<Font>("Assets/ResourcesOut/Font/GameFont1.ttf"); }
     }
 
     public static Font secondary
     {
-        get { return ResourceCacheManager.Instance.GetCached<Font>("Assets/ResourcesOut/BuiltIn/Font/GameFont2.ttf"); }
+        get { return ResourceCacheManager.Instance.GetCached<Font>("Assets/ResourcesOut/Font/GameFont2.ttf"); }
     }
 
     /// <summary>

--
Gitblit v1.8.0