yyl
2026-02-12 5667c0a5e6b83964e2538a17dcfd6b719692ddda
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");
                        // 验证包裹是否已成功初始化
                        if (package.InitializeStatus == EOperationStatus.Succeed)
                        {
                            Debug.Log($"[YooAssetService] Reusing existing package '{pkgName}' (InitializeStatus=Succeed)");
                        }
                        else
                        {
                            // 包裹存在但初始化未完成或失败(僵尸包裹)
                            // 销毁后重新创建并初始化
                            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 @@
            // 优先复用已存在的包裹(可能由 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;
        }