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()