using System.Collections.Generic; using UnityEditor; namespace AlicizaX.PackageManager.Editor { internal static class UpdateAllPackageHelper { private static readonly Queue PackagesToUpdate = new Queue(); private static FrameworkPackageManagerWindow s_window; private static int s_totalCount; private static int s_currentIndex; public static void UpdatePackages(FrameworkPackageManagerWindow window) { if (window == null) { return; } if (PackageOperationRunner.IsBusy) { EditorUtility.DisplayDialog("更新包", "当前有其他包操作正在执行。", "确定"); return; } var updatablePackages = CollectUpdatablePackages(window.RepositoryPackageDatas); if (updatablePackages.Count == 0) { EditorUtility.DisplayDialog("更新包", "当前没有可更新的包。", "确定"); return; } var confirm = EditorUtility.DisplayDialog( "更新包提示", $"检测到 {updatablePackages.Count} 个包可更新,是否继续?\n更新完成后建议重新打开 Unity。", "是", "否"); if (!confirm) { return; } s_window = window; PackagesToUpdate.Clear(); foreach (var package in updatablePackages) { PackagesToUpdate.Enqueue(package); } s_totalCount = PackagesToUpdate.Count; s_currentIndex = 0; UpdateNextPackage(); } public static void UpdatePackage(FrameworkPackageManagerWindow window, RepositoryPackageData package) { if (window == null || package == null) { return; } if (PackageOperationRunner.IsBusy) { EditorUtility.DisplayDialog("更新包", "当前有其他包操作正在执行。", "确定"); return; } if (package.PackageState != PackageState.Update) { EditorUtility.DisplayDialog("更新包", "当前包没有检测到远端更新。", "确定"); return; } s_window = window; PackagesToUpdate.Clear(); PackagesToUpdate.Enqueue(package); s_totalCount = 1; s_currentIndex = 0; UpdateNextPackage(); } private static List CollectUpdatablePackages(List repositoryPackageDatas) { var result = new List(); if (repositoryPackageDatas == null) { return result; } foreach (var package in repositoryPackageDatas) { if (package == null || package.PackageState != PackageState.Update) { continue; } if (string.IsNullOrEmpty(package.cloneUrl)) { continue; } result.Add(package); } return result; } private static void UpdateNextPackage() { if (PackagesToUpdate.Count == 0) { EditorUtility.ClearProgressBar(); s_window?.Refresh(); return; } s_currentIndex++; var package = PackagesToUpdate.Dequeue(); var canceled = EditorUtility.DisplayCancelableProgressBar( "正在更新包", $"{s_currentIndex}/{s_totalCount} {package.name}", (float)s_currentIndex / s_totalCount); if (canceled) { PackagesToUpdate.Clear(); EditorUtility.ClearProgressBar(); return; } PackageManagerCheckTool.UpdatePackage(package, (success, _) => { if (!success) { EditorUtility.ClearProgressBar(); return; } UpdateNextPackage(); }); } } }