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