117 lines
4.2 KiB
C#
117 lines
4.2 KiB
C#
![]() |
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();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|