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