This commit is contained in:
陈思海 2025-02-20 13:15:18 +08:00
parent 85aa78bf12
commit 6c4f535b58
5 changed files with 133 additions and 4 deletions

View File

@ -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
{
/// <summary>
/// 更新包帮助类
/// </summary>
internal static class UpdateAllPackageHelper
{
private static AddRequest _addRequest;
private static readonly Queue<RepositoryPackageData> PackagesToUpdate = new Queue<RepositoryPackageData>();
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);
}
}
/// <summary>
/// 更新指定包
/// </summary>
/// <param name="packageName">包名</param>
/// <param name="packageUrl">包地址</param>
public static void UpdatePackages(RepositoryPackageData repositoryPackageData)
{
PackagesToUpdate.Enqueue(repositoryPackageData);
}
private static void UpdatePackagesFromManifest(List<RepositoryPackageData> RepositoryPackageDatas)
{
foreach (var package in RepositoryPackageDatas)
{
string packageUrl = package.cloneUrl;
if (packageUrl.EndsWith(".git") && package.PackageState == PackageState.Update)
{
UpdatePackages(package);
}
}
StartUpdate();
}
/// <summary>
/// 开始更新
/// </summary>
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();
}
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: f5dac61f7c2046f1a7dcd221b36c67cb
timeCreated: 1740027829

View File

@ -20,7 +20,17 @@ namespace AlicizaX.PackageManager.Editor
Instance = this; 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) => RepositoryDataFetcher.FetchRepositoryData((datas) =>
{ {

View File

@ -27,7 +27,7 @@ namespace AlicizaX.PackageManager.Editor
stateLabel.style.flexGrow = 1; // 让 Label 占据剩余空间 stateLabel.style.flexGrow = 1; // 让 Label 占据剩余空间
Add(stateLabel); Add(stateLabel);
btnRefresh = new Button(); btnRefresh = new Button(OnBtnRefreshClick);
btnRefresh.name = "btnRefresh"; btnRefresh.name = "btnRefresh";
btnRefresh.style.maxHeight = 30; btnRefresh.style.maxHeight = 30;
@ -39,7 +39,7 @@ namespace AlicizaX.PackageManager.Editor
private void OnBtnRefreshClick() private void OnBtnRefreshClick()
{ {
// RepositoryDataFetcher.RefreshPackageData(null); UpdateAllPackageHelper.UpdatePackages();
} }
} }
} }

View File

@ -192,7 +192,7 @@ namespace AlicizaX.PackageManager.Editor
private void OnBtnUpdate() private void OnBtnUpdate()
{ {
PackageManagerCheckTool.UpdatePackage(_selectRepositoryPackageData.name); PackageManagerCheckTool.InstallPackage(_selectRepositoryPackageData.cloneUrl);
} }
private void OnBtnInstall() private void OnBtnInstall()