From 6c4f535b582b260a0803c258b64dde3d9cb180f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=80=9D=E6=B5=B7?= <10001@qq.com> Date: Thu, 20 Feb 2025 13:15:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PackageManager/UpdateAllPackageHelper.cs | 116 ++++++++++++++++++ .../UpdateAllPackageHelper.cs.meta | 3 + .../Window/FrameworkPackageManagerWindow.cs | 12 +- .../Window/PackageBottomStateBar.cs | 4 +- .../PackageManager/Window/PackageInfoView.cs | 2 +- 5 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 Editor/PackageManager/UpdateAllPackageHelper.cs create mode 100644 Editor/PackageManager/UpdateAllPackageHelper.cs.meta diff --git a/Editor/PackageManager/UpdateAllPackageHelper.cs b/Editor/PackageManager/UpdateAllPackageHelper.cs new file mode 100644 index 0000000..117334e --- /dev/null +++ b/Editor/PackageManager/UpdateAllPackageHelper.cs @@ -0,0 +1,116 @@ +using UnityEditor; +using UnityEngine; +using System.IO; +using System.Collections.Generic; +using UnityEditor.PackageManager; +using UnityEditor.PackageManager.Requests; +using Newtonsoft.Json.Linq; + +namespace AlicizaX.PackageManager.Editor +{ + /// + /// 更新包帮助类 + /// + internal static class UpdateAllPackageHelper + { + private static AddRequest _addRequest; + private static readonly Queue PackagesToUpdate = new Queue(); + private static int _allPackagesCount = 0; + private static int _updatingPackagesIndex = 0; + + public static void UpdatePackages() + { + var result = EditorUtility.DisplayDialog("更新包提示", "是否更新所有包?\n 更新完成之后可能需要重启Unity", "是", "否"); + if (result) + { + UpdatePackagesFromManifest(FrameworkPackageManagerWindow.Instance.RepositoryPackageDatas); + } + } + + /// + /// 更新指定包 + /// + /// 包名 + /// 包地址 + public static void UpdatePackages(RepositoryPackageData repositoryPackageData) + { + PackagesToUpdate.Enqueue(repositoryPackageData); + } + + private static void UpdatePackagesFromManifest(List RepositoryPackageDatas) + { + foreach (var package in RepositoryPackageDatas) + { + string packageUrl = package.cloneUrl; + if (packageUrl.EndsWith(".git") && package.PackageState == PackageState.Update) + { + UpdatePackages(package); + } + } + + StartUpdate(); + } + + /// + /// 开始更新 + /// + public static void StartUpdate() + { + _allPackagesCount = PackagesToUpdate.Count; + _updatingPackagesIndex = 0; + if (PackagesToUpdate.Count > 0) + { + UpdateNextPackage(); + } + else + { + UnityEngine.Debug.Log("No packages to update."); + } + } + + private static void UpdateNextPackage() + { + if (PackagesToUpdate.Count > 0) + { + _updatingPackagesIndex++; + var repositoryPackageData = PackagesToUpdate.Dequeue(); + _addRequest = Client.Add(repositoryPackageData.cloneUrl); + EditorApplication.update += UpdatingProgressHandler; + var isCancelableProgressBar = EditorUtility.DisplayCancelableProgressBar("正在更新包", $"{_updatingPackagesIndex}/{_allPackagesCount} ({repositoryPackageData.name})", (float)_updatingPackagesIndex / _allPackagesCount); + if (isCancelableProgressBar) + { + EditorUtility.DisplayProgressBar("正在取消更新", "请等待...", 0.5f); + PackagesToUpdate.Clear(); + EditorUtility.ClearProgressBar(); + EditorApplication.update -= UpdatingProgressHandler; + AssetDatabase.Refresh(); + } + } + else + { + EditorUtility.ClearProgressBar(); + UnityEngine.Debug.Log("All packages updated."); + AssetDatabase.Refresh(); + } + } + + private static void UpdatingProgressHandler() + { + if (_addRequest.IsCompleted) + { + if (_addRequest.Status == StatusCode.Success) + { + FrameworkPackageManagerWindow.Instance.RefreshPackage(_addRequest.Result.name); + UnityEngine.Debug.Log($"Updated package: {_addRequest.Result.name}"); + } + else if (_addRequest.Status >= StatusCode.Failure) + { + UnityEngine.Debug.LogError($"Failed to update package: {_addRequest.Error.message}"); + } + + EditorApplication.update -= UpdatingProgressHandler; + UpdateNextPackage(); + } + } + } +} diff --git a/Editor/PackageManager/UpdateAllPackageHelper.cs.meta b/Editor/PackageManager/UpdateAllPackageHelper.cs.meta new file mode 100644 index 0000000..b159330 --- /dev/null +++ b/Editor/PackageManager/UpdateAllPackageHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f5dac61f7c2046f1a7dcd221b36c67cb +timeCreated: 1740027829 \ No newline at end of file diff --git a/Editor/PackageManager/Window/FrameworkPackageManagerWindow.cs b/Editor/PackageManager/Window/FrameworkPackageManagerWindow.cs index 754319d..05dd3ff 100644 --- a/Editor/PackageManager/Window/FrameworkPackageManagerWindow.cs +++ b/Editor/PackageManager/Window/FrameworkPackageManagerWindow.cs @@ -20,7 +20,17 @@ namespace AlicizaX.PackageManager.Editor Instance = this; } - public void RefreshPackageData(Action callBack) + public void RefreshPackage(string packageName) + { + var package = RepositoryPackageDatas.Find(t => t.name.Equals(packageName)); + if (package != null) + { + packageListView.itemsSource = RepositoryPackageDatas; + packageListView.Rebuild(); + } + } + + private void RefreshPackageData(Action callBack) { RepositoryDataFetcher.FetchRepositoryData((datas) => { diff --git a/Editor/PackageManager/Window/PackageBottomStateBar.cs b/Editor/PackageManager/Window/PackageBottomStateBar.cs index 3111a04..2c39daf 100644 --- a/Editor/PackageManager/Window/PackageBottomStateBar.cs +++ b/Editor/PackageManager/Window/PackageBottomStateBar.cs @@ -27,7 +27,7 @@ namespace AlicizaX.PackageManager.Editor stateLabel.style.flexGrow = 1; // 让 Label 占据剩余空间 Add(stateLabel); - btnRefresh = new Button(); + btnRefresh = new Button(OnBtnRefreshClick); btnRefresh.name = "btnRefresh"; btnRefresh.style.maxHeight = 30; @@ -39,7 +39,7 @@ namespace AlicizaX.PackageManager.Editor private void OnBtnRefreshClick() { - // RepositoryDataFetcher.RefreshPackageData(null); + UpdateAllPackageHelper.UpdatePackages(); } } } diff --git a/Editor/PackageManager/Window/PackageInfoView.cs b/Editor/PackageManager/Window/PackageInfoView.cs index ed799b4..db281eb 100644 --- a/Editor/PackageManager/Window/PackageInfoView.cs +++ b/Editor/PackageManager/Window/PackageInfoView.cs @@ -192,7 +192,7 @@ namespace AlicizaX.PackageManager.Editor private void OnBtnUpdate() { - PackageManagerCheckTool.UpdatePackage(_selectRepositoryPackageData.name); + PackageManagerCheckTool.InstallPackage(_selectRepositoryPackageData.cloneUrl); } private void OnBtnInstall()