FM/Assets/Scripts/Editor/UploadAssets/UploadResourcesEditor.cs

193 lines
6.4 KiB
C#
Raw Normal View History

2025-06-04 22:49:37 +08:00
using System;
using System.IO;
using System.Linq;
using System.Threading;
2025-06-04 22:49:37 +08:00
using Cysharp.Threading.Tasks;
using Sirenix.OdinInspector;
using Sirenix.OdinInspector.Editor;
using UnityEditor;
using UnityEngine;
using UnityEngine.Serialization;
2025-06-04 22:49:37 +08:00
namespace HK.Editor
{
[System.Serializable]
public class OSSConfig : HK.OSSConfig
2025-06-04 22:49:37 +08:00
{
[ReadOnly] public BuildTargetPlatform platform;
public string appVersion;
public string GetOssUploadUrl()
2025-06-04 22:49:37 +08:00
{
// https://kiosk-assets-bundle.oss-cn-hongkong.aliyuncs.com/Framework
return $"CDN/{GetPlatformName()}/{appVersion}";
2025-06-04 22:49:37 +08:00
}
string GetPlatformName()
2025-06-04 22:49:37 +08:00
{
switch (platform)
{
case BuildTargetPlatform.StandaloneWindows:
return "PC";
2025-06-04 22:49:37 +08:00
break;
case BuildTargetPlatform.StandaloneWindows64:
return "PC";
2025-06-04 22:49:37 +08:00
break;
case BuildTargetPlatform.Android:
return "Android";
2025-06-04 22:49:37 +08:00
break;
case BuildTargetPlatform.WebGL:
return "WebGL";
2025-06-04 22:49:37 +08:00
break;
case BuildTargetPlatform.IOS:
return "iOS";
2025-06-04 22:49:37 +08:00
break;
case BuildTargetPlatform.StandaloneOSX:
break;
case BuildTargetPlatform.StandaloneLinux64:
break;
case BuildTargetPlatform.TvOS:
break;
case BuildTargetPlatform.PS4:
break;
default:
throw new ArgumentOutOfRangeException();
}
return "";
}
}
[System.Serializable]
public class ResourceConfig
{
public string rootFolder = "Bundles";
public BuildTargetPlatform platform = BuildTargetPlatform.StandaloneWindows64;
public string packageName = "DefaultPackage";
[ReadOnly] public string latestVersionPath;
public string GetPackageFolder()
{
return Path.Combine(rootFolder, platform.ToString().Replace(" ", ""), packageName);
}
}
public class UploadResourcesEditor : OdinEditorWindow
{
[MenuItem("Tool/Upload Resources")]
static void GetWindow()
{
// GetWindow<UploadResourcesEditor>().Show();
var window = GetWindow<UploadResourcesEditor>();
window.ossConfig = new OSSConfig();
window.ossConfig.appVersion = "v1.0";
window.ossConfig.platform = BuildTargetPlatform.StandaloneWindows;
window.Show();
}
public OSSConfig ossConfig;
public ResourceConfig resourceConfig;
[Button("GetAssetVersion")]
public void GetAssetVersion()
{
string _latestVersion;
string versionRootPath = resourceConfig.GetPackageFolder();
Debug.Log(versionRootPath);
versionRootPath = Path.GetFullPath(versionRootPath);
// 2. 检查版本根目录是否存在
if (!Directory.Exists(versionRootPath))
2025-06-04 22:49:37 +08:00
{
Debug.Log($"版本根目录不存在:{versionRootPath}\n请检查目录配置是否正确");
return;
2025-06-04 22:49:37 +08:00
}
// 3. 获取所有版本目录如2025-08-25-669
var versionDirectories = Directory.GetDirectories(versionRootPath)
.Select(Path.GetFileName)
.Where(dir => IsValidDateVersionFormat(dir)) // 过滤日期格式的目录
.ToList();
if (versionDirectories.Count == 0)
2025-06-04 22:49:37 +08:00
{
Debug.Log($"未找到任何版本目录:{versionRootPath}\n请确认已构建资源");
return;
2025-06-04 22:49:37 +08:00
}
// 4. 按日期排序(最新的日期在最后)
var sortedVersions = versionDirectories
.OrderBy(dir => ParseDateFromVersion(dir)) // 按日期升序
.ToList();
// 5. 最新版本是最后一个
_latestVersion = sortedVersions.Last();
resourceConfig.latestVersionPath = Path.Combine(versionRootPath, _latestVersion);
ossConfig.platform = resourceConfig.platform;
}
/// <summary>
/// 验证目录名是否为日期格式如2025-08-25-669
/// </summary>
private bool IsValidDateVersionFormat(string dirName)
{
// 分割格式:日期-编号如2025-08-25-669 → 前3部分是日期
string[] parts = dirName.Split('-');
if (parts.Length < 3)
return false;
// 尝试解析日期部分前3段年-月-日)
return DateTime.TryParse($"{parts[0]}-{parts[1]}-{parts[2]}", out _);
}
/// <summary>
/// 从目录名中解析日期(用于排序)
/// </summary>
private DateTime ParseDateFromVersion(string dirName)
{
string[] parts = dirName.Split('-');
DateTime.TryParse($"{parts[0]}-{parts[1]}-{parts[2]}", out DateTime date);
return date;
}
CancellationTokenSource source;
bool isUploading = false;
[ReadOnly] [ShowIf("isUploading")] [ProgressBar(0, 100, 0, 255, 0)]
public float progress;
[Button("上传资源到本地服务器")]
public async void UploadResources()
{
Debug.Log("Upload Resources Start");
isUploading = true;
progress = 0;
GetAssetVersion();
var ossUploadUrl = ossConfig.GetOssUploadUrl();
Debug.Log(ossUploadUrl);
AliyunOSSManager.Instance.Initialize(ossConfig);
source = new CancellationTokenSource();
await AliyunOSSManager.Instance.UploadDirectoryAsync(resourceConfig.latestVersionPath, ossUploadUrl,
source.Token,
ProgressCallback);
isUploading = false;
2025-06-04 22:49:37 +08:00
Debug.Log("Upload Resources Finished");
}
[ShowIf("isUploading")]
[Button("取消上传资源到本地服务器")]
public void CancelUploadResources()
{
progress = 0;
source.Cancel();
}
private void ProgressCallback(int arg1, int arg2)
{
progress = ((float)arg1 / arg2) * 100;
Debug.Log($"progress {arg1}/{arg2}");
}
2025-06-04 22:49:37 +08:00
}
}