From f680963a73315136be5a1e4edd5e15295821fc90 Mon Sep 17 00:00:00 2001
From: zc <1062808664@qq.com>
Date: Mon, 15 Sep 2025 13:22:32 +0800
Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E7=BC=96=E8=BE=91=E5=99=A8?=
=?UTF-8?q?=E4=B8=8A=E4=BC=A0=E8=B5=84=E6=BA=90=E5=88=B0oss=E6=9C=8D?=
=?UTF-8?q?=E5=8A=A1=E5=99=A8=E9=83=A8=E7=BD=B2=E7=83=AD=E6=9B=B4=E8=B5=84?=
=?UTF-8?q?=E6=BA=90=E5=B7=A5=E5=85=B7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Assets/Resources/PatchWindow.prefab | 32 ++--
Assets/Scenes/FUJIFILM.unity | 2 +-
Assets/Scripts/Base/Net/AliyunOSSManager.cs | 69 ++++++-
Assets/Scripts/Base/Res/InitializePackage.cs | 57 +++---
.../UploadAssets/UploadResourcesEditor.cs | 181 ++++++++++++++----
.../YooAssetLocalVersionFetcher.cs | 122 ++++++++++++
.../YooAssetLocalVersionFetcher.cs.meta | 3 +
Assets/Scripts/Test.meta | 3 +
.../yoo/DefaultPackage/BuildinCatalog.bytes | Bin 7173 -> 7172 bytes
.../yoo/DefaultPackage/BuildinCatalog.json | 10 +-
.../yoo/DefaultPackage/DefaultPackage.version | 2 +-
.../DefaultPackage_2025-09-14-655.bytes | Bin 0 -> 46197 bytes
.../DefaultPackage_2025-09-14-655.hash | 1 +
13 files changed, 390 insertions(+), 92 deletions(-)
create mode 100644 Assets/Scripts/Editor/UploadAssets/YooAssetLocalVersionFetcher.cs
create mode 100644 Assets/Scripts/Editor/UploadAssets/YooAssetLocalVersionFetcher.cs.meta
create mode 100644 Assets/Scripts/Test.meta
create mode 100644 yoo/DefaultPackage/ManifestFiles/DefaultPackage_2025-09-14-655.bytes
create mode 100644 yoo/DefaultPackage/ManifestFiles/DefaultPackage_2025-09-14-655.hash
diff --git a/Assets/Resources/PatchWindow.prefab b/Assets/Resources/PatchWindow.prefab
index 0f81b2d..8af48f8 100644
--- a/Assets/Resources/PatchWindow.prefab
+++ b/Assets/Resources/PatchWindow.prefab
@@ -67,7 +67,7 @@ MonoBehaviour:
m_Calls: []
m_text: No
m_isRightToLeft: 0
- m_fontAsset: {fileID: 11400000, guid: b62d42a4efb0a374b8d61e0f108b3d4d, type: 2}
+ m_fontAsset: {fileID: 0}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
@@ -282,8 +282,9 @@ MonoBehaviour:
m_Calls: []
m_text: Error Tips
m_isRightToLeft: 0
- m_fontAsset: {fileID: 11400000, guid: b62d42a4efb0a374b8d61e0f108b3d4d, type: 2}
- m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+ m_fontAsset: {fileID: 11400000, guid: 41512a7f2b107664d9d14634f444209a, type: 2}
+ m_sharedMaterial: {fileID: -3454106745002405512, guid: 41512a7f2b107664d9d14634f444209a,
+ type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
@@ -329,7 +330,7 @@ MonoBehaviour:
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
- m_ActiveFontFeatures: 00000000
+ m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
@@ -806,7 +807,7 @@ MonoBehaviour:
m_Calls: []
m_text: Download Tips
m_isRightToLeft: 0
- m_fontAsset: {fileID: 11400000, guid: b62d42a4efb0a374b8d61e0f108b3d4d, type: 2}
+ m_fontAsset: {fileID: 0}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
@@ -942,7 +943,7 @@ MonoBehaviour:
m_Calls: []
m_text: Download Tips
m_isRightToLeft: 0
- m_fontAsset: {fileID: 11400000, guid: b62d42a4efb0a374b8d61e0f108b3d4d, type: 2}
+ m_fontAsset: {fileID: 0}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
@@ -1078,7 +1079,7 @@ MonoBehaviour:
m_Calls: []
m_text: Single
m_isRightToLeft: 0
- m_fontAsset: {fileID: 11400000, guid: b62d42a4efb0a374b8d61e0f108b3d4d, type: 2}
+ m_fontAsset: {fileID: 0}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
@@ -1508,7 +1509,7 @@ MonoBehaviour:
m_Calls: []
m_text: Tips
m_isRightToLeft: 0
- m_fontAsset: {fileID: 11400000, guid: b62d42a4efb0a374b8d61e0f108b3d4d, type: 2}
+ m_fontAsset: {fileID: 0}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
@@ -1680,7 +1681,7 @@ MonoBehaviour:
m_Calls: []
m_text: Download Tips
m_isRightToLeft: 0
- m_fontAsset: {fileID: 11400000, guid: b62d42a4efb0a374b8d61e0f108b3d4d, type: 2}
+ m_fontAsset: {fileID: 0}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
@@ -2102,7 +2103,7 @@ MonoBehaviour:
m_Calls: []
m_text: Yes
m_isRightToLeft: 0
- m_fontAsset: {fileID: 11400000, guid: b62d42a4efb0a374b8d61e0f108b3d4d, type: 2}
+ m_fontAsset: {fileID: 0}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
@@ -2238,7 +2239,7 @@ MonoBehaviour:
m_Calls: []
m_text: Quit
m_isRightToLeft: 0
- m_fontAsset: {fileID: 11400000, guid: b62d42a4efb0a374b8d61e0f108b3d4d, type: 2}
+ m_fontAsset: {fileID: 0}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
@@ -2707,8 +2708,9 @@ MonoBehaviour:
m_Calls: []
m_text: Error Tips
m_isRightToLeft: 0
- m_fontAsset: {fileID: 11400000, guid: b62d42a4efb0a374b8d61e0f108b3d4d, type: 2}
- m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+ m_fontAsset: {fileID: 11400000, guid: 41512a7f2b107664d9d14634f444209a, type: 2}
+ m_sharedMaterial: {fileID: -3454106745002405512, guid: 41512a7f2b107664d9d14634f444209a,
+ type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
@@ -2754,7 +2756,7 @@ MonoBehaviour:
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
- m_ActiveFontFeatures: 00000000
+ m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
@@ -2809,12 +2811,12 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 7576580477895193190}
+ - {fileID: 2842693604647789047}
- {fileID: 2747978461159930281}
- {fileID: 256288714842573992}
- {fileID: 123959232355030105}
- {fileID: 1686210318258698559}
- {fileID: 8786280722722952149}
- - {fileID: 2842693604647789047}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
diff --git a/Assets/Scenes/FUJIFILM.unity b/Assets/Scenes/FUJIFILM.unity
index 16f1ea9..a486838 100644
--- a/Assets/Scenes/FUJIFILM.unity
+++ b/Assets/Scenes/FUJIFILM.unity
@@ -5795,7 +5795,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 71b2355dc85b45e2aacc12328451f8d1, type: 3}
m_Name:
m_EditorClassIdentifier:
- PlayMode: 0
+ PlayMode: 2
packageName: DefaultPackage
hostServerIP: https://kiosk-assets-bundle.oss-cn-hongkong.aliyuncs.com/Framework/CDN/
sceneName:
diff --git a/Assets/Scripts/Base/Net/AliyunOSSManager.cs b/Assets/Scripts/Base/Net/AliyunOSSManager.cs
index 69faf6f..3737367 100644
--- a/Assets/Scripts/Base/Net/AliyunOSSManager.cs
+++ b/Assets/Scripts/Base/Net/AliyunOSSManager.cs
@@ -1,5 +1,6 @@
using System;
using System.IO;
+using System.Threading;
using System.Threading.Tasks;
using Aliyun.OSS;
using Aliyun.OSS.Common;
@@ -7,6 +8,7 @@ using UnityEngine;
namespace HK
{
+ [System.Serializable]
public class OSSConfig
{
// 阿里云AccessKeyId
@@ -22,10 +24,10 @@ namespace HK
public string bucketName = "kiosk-assets-bundle";
// OSS上的资源根存储目录
- public string ossRootDirectory = "Framework/"; //
+ public string ossRootDirectory = "Framework"; //
// OSS上的资源相对存储目录
- public string ossRelativePath = "GameRes/v1.0/"; //
+ public string ossRelativePath = ""; //
}
///
@@ -201,6 +203,69 @@ namespace HK
}
}
+ public async Task UploadDirectoryAsync(string localDirectory, string ossDirectory, CancellationToken cancellationToken = default,
+ Action progressCallback = null)
+ {
+ if (!CheckInitialized()) return false;
+ if (!Directory.Exists(localDirectory))
+ {
+ Debug.LogError($"本地目录不存在: {localDirectory}");
+ return false;
+ }
+
+ try
+ {
+ // 检查是否已取消
+ cancellationToken.ThrowIfCancellationRequested();
+
+ // 获取所有文件
+ string[] allFiles = Directory.GetFiles(localDirectory, "*.*", SearchOption.AllDirectories);
+ int totalCount = allFiles.Length;
+ int currentCount = 0;
+
+ foreach (string filePath in allFiles)
+ {
+ // 每次循环开始前检查是否取消
+ cancellationToken.ThrowIfCancellationRequested();
+
+ // 计算相对路径
+ string relativePath = Path.GetRelativePath(localDirectory, filePath);
+ // 转换为OSS路径格式(替换反斜杠为正斜杠)
+ relativePath = relativePath.Replace('\\', '/');
+
+ // 构建OSS目标路径
+ string ossTargetPath = string.IsNullOrEmpty(ossDirectory)
+ ? relativePath
+ : $"{ossDirectory}/{relativePath}";
+
+ // 上传单个文件(传入取消令牌)
+ bool success = await UploadFileAsync(filePath, ossTargetPath);
+ if (!success)
+ {
+ Debug.LogError($"目录上传中断,文件上传失败: {filePath}");
+ return false;
+ }
+
+ // 进度回调
+ currentCount++;
+ progressCallback?.Invoke(currentCount, totalCount);
+ }
+
+ Debug.Log($"目录上传完成,共上传 {totalCount} 个文件");
+ return true;
+ }
+ catch (OperationCanceledException)
+ {
+ Debug.Log("目录上传已被取消");
+ return false;
+ }
+ catch (Exception ex)
+ {
+ Debug.LogError($"目录上传异常: {ex.Message}");
+ return false;
+ }
+ }
+
///
/// 从OSS下载文件到本地(优化版)
///
diff --git a/Assets/Scripts/Base/Res/InitializePackage.cs b/Assets/Scripts/Base/Res/InitializePackage.cs
index 624bd11..4833147 100644
--- a/Assets/Scripts/Base/Res/InitializePackage.cs
+++ b/Assets/Scripts/Base/Res/InitializePackage.cs
@@ -178,34 +178,29 @@ namespace HK
///
private string GetHostServerURL()
{
- // OSS基础信息(替换为你的Bucket信息)
- string bucketName = "kiosk-assets-bundle";
- string endpoint = "oss-cn-hongkong.aliyuncs.com"; // 地域Endpoint
- string appVersion = "v1.0"; // 资源版本号(需与OSS目录一致)
- string rootPath = "Framework/CDN"; // OSS上的资源根目录
+ //string hostServerIP = "http://10.0.2.2"; //安卓模拟器地址
+ // string hostServerIP = "http://127.0.0.1";
+ string hostServerIP = "https://kiosk-assets-bundle.oss-cn-hongkong.aliyuncs.com/Framework";
+ string appVersion = "v1.0";
- // 获取平台路径(与OSS的平台目录对应)
- string platformPath = GetPlatformPath();
-
- // 拼接OSS完整URL(格式:https://bucket.endpoint/rootPath/platform/version/)
- // https://kiosk-assets-bundle.oss-cn-hongkong.aliyuncs.com/FUJIFILM/CDN/PC/v1.0/01184a0f7f1c00a9e28a6932cfbe1a4f.bundle
- return $"https://{bucketName}.{endpoint}/{rootPath}/{platformPath}/{appVersion}/";
- }
-
-// 辅助方法:获取平台对应的目录名
- private string GetPlatformPath()
- {
#if UNITY_EDITOR
- var buildTarget = UnityEditor.EditorUserBuildSettings.activeBuildTarget;
- if (buildTarget == UnityEditor.BuildTarget.Android) return "Android";
- else if (buildTarget == UnityEditor.BuildTarget.iOS) return "iOS";
- else if (buildTarget == UnityEditor.BuildTarget.WebGL) return "WebGL";
- else return "PC";
+ if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.Android)
+ return $"{hostServerIP}/CDN/Android/{appVersion}";
+ else if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.iOS)
+ return $"{hostServerIP}/CDN/IPhone/{appVersion}";
+ else if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.WebGL)
+ return $"{hostServerIP}/CDN/WebGL/{appVersion}";
+ else
+ return $"{hostServerIP}/CDN/PC/{appVersion}";
#else
- if (Application.platform == RuntimePlatform.Android) return "Android";
- else if (Application.platform == RuntimePlatform.IPhonePlayer) return "iOS";
- else if (Application.platform == RuntimePlatform.WebGLPlayer) return "WebGL";
- else return "PC";
+ if (Application.platform == RuntimePlatform.Android)
+ return $"{hostServerIP}/CDN/Android/{appVersion}";
+ else if (Application.platform == RuntimePlatform.IPhonePlayer)
+ return $"{hostServerIP}/CDN/IPhone/{appVersion}";
+ else if (Application.platform == RuntimePlatform.WebGLPlayer)
+ return $"{hostServerIP}/CDN/WebGL/{appVersion}";
+ else
+ return $"{hostServerIP}/CDN/PC/{appVersion}";
#endif
}
@@ -240,6 +235,7 @@ namespace HK
private async UniTask UpdatePackageVersion()
{
+ Debug.Log("请求资源版本 !");
var package = YooAssets.GetPackage(PackageName);
var operation = package.RequestPackageVersionAsync();
await operation.Task;
@@ -265,6 +261,7 @@ namespace HK
private async UniTask FsmUpdatePackageManifest()
{
+ Debug.Log("更新资源清单!");
var package = YooAssets.GetPackage(PackageName);
var operation = package.UpdatePackageManifestAsync(packageVersion);
await operation.Task;
@@ -288,7 +285,7 @@ namespace HK
private async UniTask FsmCreateDownloader()
{
await UniTask.Yield();
- Log.Debug("创建资源下载器!");
+ Debug.Log("创建资源下载器!");
CreateDownloader();
}
@@ -326,7 +323,7 @@ namespace HK
private async UniTask FsmDownloadPackageFiles()
{
await UniTask.Yield();
- Log.Debug("开始下载资源文件!");
+ Debug.Log("开始下载资源文件!");
downloader.DownloadErrorCallback = DownloadErrorCallback;
downloader.DownloadUpdateCallback = DownloadProgressCallback;
downloader.BeginDownload();
@@ -360,7 +357,7 @@ namespace HK
private async UniTask FsmDownloadPackageOver()
{
await UniTask.Yield();
- Log.Debug("资源文件下载完毕!");
+ Debug.Log("资源文件下载完毕!");
await FsmClearCacheBundle();
}
@@ -371,7 +368,7 @@ namespace HK
private async UniTask FsmClearCacheBundle()
{
await UniTask.Yield();
- Log.Debug("清理未使用的缓存文件!");
+ Debug.Log("清理未使用的缓存文件!");
var package = YooAssets.GetPackage(PackageName);
var operation = package.ClearCacheFilesAsync(EFileClearMode.ClearUnusedBundleFiles);
operation.Completed += Operation_Completed;
@@ -389,7 +386,7 @@ namespace HK
private async UniTask FsmStartGame()
{
await UniTask.Yield();
- Log.Debug("开始游戏!");
+ Debug.Log("开始游戏!");
}
#endregion
diff --git a/Assets/Scripts/Editor/UploadAssets/UploadResourcesEditor.cs b/Assets/Scripts/Editor/UploadAssets/UploadResourcesEditor.cs
index b13ee43..a4d0adb 100644
--- a/Assets/Scripts/Editor/UploadAssets/UploadResourcesEditor.cs
+++ b/Assets/Scripts/Editor/UploadAssets/UploadResourcesEditor.cs
@@ -1,60 +1,46 @@
using System;
using System.IO;
using System.Linq;
+using System.Threading;
using Cysharp.Threading.Tasks;
using Sirenix.OdinInspector;
using Sirenix.OdinInspector.Editor;
using UnityEditor;
using UnityEngine;
+using UnityEngine.Serialization;
namespace HK.Editor
{
- public class UploadResourcesEditor : OdinEditorWindow
+ [System.Serializable]
+ public class OSSConfig : HK.OSSConfig
{
- [MenuItem("Tool/Upload Resources")]
- static void GetWindow()
+ [ReadOnly] public BuildTargetPlatform platform;
+ public string appVersion;
+
+ public string GetOssUploadUrl()
{
- // GetWindow().Show();
- var window = GetWindow();
- window.projectName = Application.productName;
- window.version = "v1.0";
- window.platform = BuildTargetPlatform.StandaloneWindows;
- window.Show();
+ // https://kiosk-assets-bundle.oss-cn-hongkong.aliyuncs.com/Framework
+ return $"CDN/{GetPlatformName()}/{appVersion}";
}
- [FolderPath] public string serverUrl;
- [FolderPath] public string assetRootFolder;
- public string projectName;
- public BuildTargetPlatform platform;
- public string version;
-
-
- [Button("上传资源到本地服务器")]
- public void UploadResources()
+ string GetPlatformName()
{
- Debug.Log("Upload Resources Start");
- var directories = Directory.GetDirectories(assetRootFolder);
- var strings = directories.OrderByDescending(a => new DirectoryInfo(a).CreationTime).ToArray();
- Debug.Log(strings[0]);
- var paths = Directory.GetFiles(strings[0]);
-
- string platformPath = "";
switch (platform)
{
case BuildTargetPlatform.StandaloneWindows:
- platformPath = "PC";
+ return "PC";
break;
case BuildTargetPlatform.StandaloneWindows64:
- platformPath = "PC";
+ return "PC";
break;
case BuildTargetPlatform.Android:
- platformPath = "Android";
+ return "Android";
break;
case BuildTargetPlatform.WebGL:
- platformPath = "WebGL";
+ return "WebGL";
break;
case BuildTargetPlatform.IOS:
- platformPath = "IOS";
+ return "iOS";
break;
case BuildTargetPlatform.StandaloneOSX:
break;
@@ -68,21 +54,140 @@ namespace HK.Editor
throw new ArgumentOutOfRangeException();
}
- var serverPath = Path.Combine(serverUrl, projectName, platformPath, version);
- if (!Directory.Exists(serverPath))
+ 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().Show();
+ var window = GetWindow();
+ 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))
{
- Directory.CreateDirectory(serverPath);
+ Debug.Log($"版本根目录不存在:{versionRootPath}\n请检查目录配置是否正确");
+ return;
}
- foreach (var path in paths)
+ // 3. 获取所有版本目录(如2025-08-25-669)
+ var versionDirectories = Directory.GetDirectories(versionRootPath)
+ .Select(Path.GetFileName)
+ .Where(dir => IsValidDateVersionFormat(dir)) // 过滤日期格式的目录
+ .ToList();
+
+ if (versionDirectories.Count == 0)
{
- var fileInfo = new FileInfo(path);
- var combine = Path.Combine(serverPath, fileInfo.Name);
- fileInfo.CopyTo(combine, true);
+ Debug.Log($"未找到任何版本目录:{versionRootPath}\n请确认已构建资源");
+ return;
}
- Debug.Log($"Upload Resources version is {strings[0]}");
+ // 4. 按日期排序(最新的日期在最后)
+ var sortedVersions = versionDirectories
+ .OrderBy(dir => ParseDateFromVersion(dir)) // 按日期升序
+ .ToList();
+
+ // 5. 最新版本是最后一个
+ _latestVersion = sortedVersions.Last();
+
+ resourceConfig.latestVersionPath = Path.Combine(versionRootPath, _latestVersion);
+ ossConfig.platform = resourceConfig.platform;
+ }
+
+ ///
+ /// 验证目录名是否为日期格式(如2025-08-25-669)
+ ///
+ 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 _);
+ }
+
+ ///
+ /// 从目录名中解析日期(用于排序)
+ ///
+ 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;
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}");
+ }
}
}
\ No newline at end of file
diff --git a/Assets/Scripts/Editor/UploadAssets/YooAssetLocalVersionFetcher.cs b/Assets/Scripts/Editor/UploadAssets/YooAssetLocalVersionFetcher.cs
new file mode 100644
index 0000000..8afb5a1
--- /dev/null
+++ b/Assets/Scripts/Editor/UploadAssets/YooAssetLocalVersionFetcher.cs
@@ -0,0 +1,122 @@
+using System;
+using System.IO;
+using System.Linq;
+using UnityEditor;
+using UnityEngine;
+using YooAsset.Editor;
+
+///
+/// YooAsset编辑器工具:获取本地构建的最新版本号
+///
+public class YooAssetLocalVersionFetcher : EditorWindow
+{
+ // 目录配置(根据你的实际路径填写)
+ private string _rootBuildFolder = "Bundles"; // 根构建目录
+ private string _platformFolder = "StandaloneWindows64"; // 平台目录
+ private string _packageFolder = "DefaultPackage"; // 资源包目录
+ private string _latestVersion = "未找到版本信息";
+
+ // 打开工具窗口
+ [MenuItem("YooAsset/获取本地最新版本号(日期格式)")]
+ public static void ShowWindow()
+ {
+ GetWindow("本地版本号查询");
+ }
+
+ private void OnGUI()
+ {
+ GUILayout.Label("版本目录配置", EditorStyles.boldLabel);
+
+ // 配置目录层级(与你的实际路径对应)
+ _rootBuildFolder = EditorGUILayout.TextField("根构建目录", _rootBuildFolder);
+ _platformFolder = EditorGUILayout.TextField("平台目录", _platformFolder);
+ _packageFolder = EditorGUILayout.TextField("资源包目录", _packageFolder);
+
+ // 配置目录层级(与你的实际路径对应)
+
+ GUILayout.Space(10);
+
+ // 点击获取最新版本
+ if (GUILayout.Button("获取本地最新版本号"))
+ {
+ FetchLatestVersion();
+ }
+
+ GUILayout.Space(10);
+ GUILayout.Label($"最新本地版本目录:{_latestVersion}", EditorStyles.label);
+ }
+
+ ///
+ /// 从日期格式的版本目录中获取最新版本
+ ///
+ private void FetchLatestVersion()
+ {
+ // 1. 计算完整的版本根目录路径
+ // 你的目录结构:Bundles\StandaloneWindows64\DefaultPackage\版本目录
+ string versionRootPath = Path.Combine(_rootBuildFolder, _platformFolder, _packageFolder);
+ ;
+ // 标准化路径(处理斜杠方向)
+ versionRootPath = Path.GetFullPath(versionRootPath);
+
+ // 2. 检查版本根目录是否存在
+ if (!Directory.Exists(versionRootPath))
+ {
+ _latestVersion = $"版本根目录不存在:{versionRootPath}\n请检查目录配置是否正确";
+ return;
+ }
+
+ // 3. 获取所有版本目录(如2025-08-25-669)
+ var versionDirectories = Directory.GetDirectories(versionRootPath)
+ .Select(Path.GetFileName)
+ .Where(dir => IsValidDateVersionFormat(dir)) // 过滤日期格式的目录
+ .ToList();
+
+ if (versionDirectories.Count == 0)
+ {
+ _latestVersion = $"未找到任何版本目录:{versionRootPath}\n请确认已构建资源";
+ return;
+ }
+
+ // 4. 按日期排序(最新的日期在最后)
+ var sortedVersions = versionDirectories
+ .OrderBy(dir => ParseDateFromVersion(dir)) // 按日期升序
+ .ToList();
+
+ // 5. 最新版本是最后一个
+ _latestVersion = sortedVersions.Last();
+
+ // 6. 验证该版本目录是否包含清单文件
+ string manifestPath = Path.Combine(versionRootPath, _latestVersion, "PackageManifest.manifest");
+ if (!File.Exists(manifestPath))
+ {
+ _latestVersion += "(警告:未找到PackageManifest.manifest,构建可能不完整)";
+ }
+
+ var v = Path.Combine(versionRootPath, _latestVersion);
+ Debug.Log(v);
+ }
+
+ ///
+ /// 验证目录名是否为日期格式(如2025-08-25-669)
+ ///
+ 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 _);
+ }
+
+ ///
+ /// 从目录名中解析日期(用于排序)
+ ///
+ private DateTime ParseDateFromVersion(string dirName)
+ {
+ string[] parts = dirName.Split('-');
+ DateTime.TryParse($"{parts[0]}-{parts[1]}-{parts[2]}", out DateTime date);
+ return date;
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/Editor/UploadAssets/YooAssetLocalVersionFetcher.cs.meta b/Assets/Scripts/Editor/UploadAssets/YooAssetLocalVersionFetcher.cs.meta
new file mode 100644
index 0000000..8116258
--- /dev/null
+++ b/Assets/Scripts/Editor/UploadAssets/YooAssetLocalVersionFetcher.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 334914fe30cd4b55acd8eacfc26f81e4
+timeCreated: 1757820725
\ No newline at end of file
diff --git a/Assets/Scripts/Test.meta b/Assets/Scripts/Test.meta
new file mode 100644
index 0000000..b44f5e5
--- /dev/null
+++ b/Assets/Scripts/Test.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 6ce5fef283ca4959b4f901c1ee2baa4c
+timeCreated: 1757755894
\ No newline at end of file
diff --git a/Assets/StreamingAssets/yoo/DefaultPackage/BuildinCatalog.bytes b/Assets/StreamingAssets/yoo/DefaultPackage/BuildinCatalog.bytes
index 3d356b824755c2cc47ebe7210d1966c8fba26330..b1118805cb61b9d1a89cc5df98baa56f317cbc89 100644
GIT binary patch
delta 103
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
literal 0
HcmV?d00001
diff --git a/yoo/DefaultPackage/ManifestFiles/DefaultPackage_2025-09-14-655.hash b/yoo/DefaultPackage/ManifestFiles/DefaultPackage_2025-09-14-655.hash
new file mode 100644
index 0000000..5e38c33
--- /dev/null
+++ b/yoo/DefaultPackage/ManifestFiles/DefaultPackage_2025-09-14-655.hash
@@ -0,0 +1 @@
+4198c757
\ No newline at end of file
|