| | |
| | | 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 |
| | | { |
| | |
| | | Debug.LogWarning($"[YooAssetService] Package '{pkgName}' init failed: {initOp.Error}"); |
| | | continue; |
| | | } |
| | | |
| | | // 初始化后必须请求版本并更新 Manifest,否则 ActiveManifest 为 null |
| | | await RequestVersionAndUpdateForPackageAsync(pkgName, package); |
| | | |
| | | Debug.Log($"[YooAssetService] Package '{pkgName}' newly initialized."); |
| | | } |
| | |
| | | } |
| | | |
| | | _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> |
| | |
| | | |
| | | // 优先复用已存在的包裹(可能由 Launch 阶段创建) |
| | | var package = YooAssets.TryGetPackage(packageName); |
| | | bool needManifest = false; |
| | | if (package == null) |
| | | { |
| | | package = YooAssets.CreatePackage(packageName); |
| | |
| | | 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."); |
| | | } |
| | | |
| | |
| | | } |
| | | 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}"); |
| | | } |
| | | } |
| | | |
| | |
| | | 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; |
| | | } |
| | | |