From 3881ae8232e43ceedcbe7341c36c37c85cd3df18 Mon Sep 17 00:00:00 2001 From: Alienjack Date: Wed, 3 Sep 2025 16:55:12 +0800 Subject: [PATCH] Make Setting Wnd More pretty --- .../VersionFlow/Editor/BuilderConfigEditor.cs | 899 +++++++++--------- Assets/VersionFlow/Editor/MsgBool.cs | 93 ++ Assets/VersionFlow/Editor/MsgBool.cs.meta | 11 + .../Editor/PatchUploader/PatchUploader.cs | 10 +- .../PatchUploaderImpl/PatchUpLoader_AliOSS.cs | 9 +- .../PatchUploader_LocalFileSystem.cs | 5 +- .../Editor/VersionFlowSettingWnd.cs | 50 +- 7 files changed, 608 insertions(+), 469 deletions(-) create mode 100644 Assets/VersionFlow/Editor/MsgBool.cs create mode 100644 Assets/VersionFlow/Editor/MsgBool.cs.meta diff --git a/Assets/VersionFlow/Editor/BuilderConfigEditor.cs b/Assets/VersionFlow/Editor/BuilderConfigEditor.cs index f2b75e5..a2f93db 100644 --- a/Assets/VersionFlow/Editor/BuilderConfigEditor.cs +++ b/Assets/VersionFlow/Editor/BuilderConfigEditor.cs @@ -1,91 +1,91 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using UnityEditor; -using UnityEngine; -using VersionFlow.Runtime; - -namespace VersionFlow.Editors -{ - [CustomEditor(typeof(BuilderConfig))] - public class BuilderConfigEditor : Editor - { - static private BundleManifest RemoteVersion; - static private string UpdateVersion; - - static public BundleManifest Report; - static private List CompareResult; - static private string outputPath; - static private Dictionary bundleExtraInfo; - static bool FoldOutGroup; - - private static void ResetState() - { - RemoteVersion = null; - UpdateVersion = null; - - Report = null; - CompareResult = null; - outputPath = null; - bundleExtraInfo = null; - } - - public override void OnInspectorGUI() - { - base.OnInspectorGUI(); - - DrawUploader(); - - var builder = target as BuilderConfig; - - EditorGUILayout.Space(20); - BuilderConfig.ShowBuilderMarker = EditorGUILayout.Toggle("在Project窗口中显示打包标记", BuilderConfig.ShowBuilderMarker); - if (FoldOutGroup = EditorGUILayout.BeginFoldoutHeaderGroup(FoldOutGroup, "打包配置")) - { - DrawGroupItems(); - EditorGUILayout.EndFoldoutHeaderGroup(); - } - - if (GUILayout.Button("获取远端版本号")) - { - ResetState(); - var (remoteVersion, updateVersion) = FetchRemoteVersion(builder); - RemoteVersion = remoteVersion; - UpdateVersion = updateVersion; - } - - if (RemoteVersion != null) - { - EditorGUILayout.LabelField($"远端版本号:{RemoteVersion.Version}"); - if (GUILayout.Button("将远端版本号复制到剪切板")) - { - EditorGUIUtility.systemCopyBuffer = RemoteVersion.Version; - } - UpdateVersion = EditorGUILayout.TextField($"上传版本号", UpdateVersion); - - if (CompareResult == null && GUILayout.Button("Build")) - { - var bc = (BuilderConfig)target; - bc.OnCalcBundleHash = BuilderConfigEditor.CalcBundleHash; - Report = bc.Build(UpdateVersion, out outputPath, out bundleExtraInfo); - CompareResult = bc.CompareBundleManifest(Report, RemoteVersion); - } - - if (CompareResult != null && Report != null && outputPath != null && bundleExtraInfo != null) - { - DrawCompareResult(CompareResult, bundleExtraInfo); - if (GUILayout.Button("UPLOAD")) - { - StartUpLoad(CompareResult, Report, outputPath, builder.GetPatchLoader()); - - ResetState(); - } - } - } +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using UnityEditor; +using UnityEngine; +using VersionFlow.Runtime; + +namespace VersionFlow.Editors +{ + [CustomEditor(typeof(BuilderConfig))] + public class BuilderConfigEditor : Editor + { + static private BundleManifest RemoteVersion; + static private string UpdateVersion; + + static public BundleManifest Report; + static private List CompareResult; + static private string outputPath; + static private Dictionary bundleExtraInfo; + static bool FoldOutGroup; + + private static void ResetState() + { + RemoteVersion = null; + UpdateVersion = null; + + Report = null; + CompareResult = null; + outputPath = null; + bundleExtraInfo = null; + } + + public override void OnInspectorGUI() + { + base.OnInspectorGUI(); + + DrawUploader(); + + var builder = target as BuilderConfig; + + EditorGUILayout.Space(20); + BuilderConfig.ShowBuilderMarker = EditorGUILayout.Toggle("在Project窗口中显示打包标记", BuilderConfig.ShowBuilderMarker); + if (FoldOutGroup = EditorGUILayout.BeginFoldoutHeaderGroup(FoldOutGroup, "打包配置")) + { + DrawGroupItems(); + EditorGUILayout.EndFoldoutHeaderGroup(); + } + + if (GUILayout.Button("获取远端版本号")) + { + ResetState(); + var (remoteVersion, updateVersion) = FetchRemoteVersion(builder); + RemoteVersion = remoteVersion; + UpdateVersion = updateVersion; + } + + if (RemoteVersion != null) + { + EditorGUILayout.LabelField($"远端版本号:{RemoteVersion.Version}"); + if (GUILayout.Button("将远端版本号复制到剪切板")) + { + EditorGUIUtility.systemCopyBuffer = RemoteVersion.Version; + } + UpdateVersion = EditorGUILayout.TextField($"上传版本号", UpdateVersion); + + if (CompareResult == null && GUILayout.Button("Build")) + { + var bc = (BuilderConfig)target; + bc.OnCalcBundleHash = BuilderConfigEditor.CalcBundleHash; + Report = bc.Build(UpdateVersion, out outputPath, out bundleExtraInfo); + CompareResult = bc.CompareBundleManifest(Report, RemoteVersion); + } + + if (CompareResult != null && Report != null && outputPath != null && bundleExtraInfo != null) + { + DrawCompareResult(CompareResult, bundleExtraInfo); + if (GUILayout.Button("UPLOAD")) + { + StartUpLoad(CompareResult, Report, outputPath, builder.GetPatchLoader()); + + ResetState(); + } + } + } } Dictionary m_uploaderEditorMapper = new Dictionary(); @@ -126,279 +126,284 @@ namespace VersionFlow.Editors EditorUtility.SetDirty(target); patchLoader.CfgChanged(builder, builder.UploaderCfgDict.GetUploaderCfg(patchLoader.GetType())); } - } - - private void DrawGroupItems() - { - Undo.RecordObject(target, target.name); - - EditorGUILayout.BeginVertical(); - - var builder = target as BuilderConfig; - builder.DuplicateBundleBeInstallBundle = EditorGUILayout.Toggle("重复依赖资源的bundle作为随包资源", builder.DuplicateBundleBeInstallBundle); - builder.ShaderBundleBeInstallBundle = EditorGUILayout.Toggle("shaderbundle作为随包资源", builder.ShaderBundleBeInstallBundle); - - foreach (var group in builder.Groups) - { - var temp = GUI.color; - - GUI.color = GetGroupColor(group, out var errorMsg); - EditorGUILayout.BeginVertical(EditorStyles.helpBox); - { - EditorGUILayout.LabelField(errorMsg); - //Name And Optionnal - EditorGUILayout.BeginHorizontal(); - { - group.MarkColor = EditorGUILayout.ColorField("标记颜色", group.MarkColor); - group.GroupName = EditorGUILayout.TextField(group.GroupName, GUILayout.Width(100)); - - var groupDeleteColor = GUI.color; - GUI.color = Color.red; - if (GUILayout.Button("X", GUILayout.Width(30))) - { - builder.Groups.Remove(group); - break; - } - GUI.color = groupDeleteColor; - } - EditorGUILayout.EndHorizontal(); - - group.OptionBundle = EditorGUILayout.Toggle($"可选下载包", group.OptionBundle); - group.InstallReady = EditorGUILayout.Toggle($"跟随主包", group.InstallReady); - - //buildMode - EditorGUILayout.BeginHorizontal(); - { - var EnumType = typeof(BuildEntity.EnumBuildMode); - var values = Enum.GetValues(EnumType); - foreach (BuildEntity.EnumBuildMode modeValue in values) - { - var modeName = Enum.GetName(EnumType, modeValue); - - var tempColor = GUI.color; - if (modeValue == group.BuildMode) GUI.color = Color.green; - else GUI.color = Color.white; - if (GUILayout.Button(new GUIContent(modeName, GetDescrib(modeValue)))) - { - group.BuildMode = modeValue; - } - GUI.color = tempColor; - } - } - EditorGUILayout.EndHorizontal(); - - EditorGUILayout.BeginVertical(new GUIStyle { padding = new RectOffset(5, 5, 5, 5) }); - { - for (int i = 0; i < group.FolderList.Count; i++) - { - EditorGUILayout.BeginHorizontal(); - { - var foldAsset = group.FolderList[i]; - var deleteColor = GUI.color; - GUI.color = Color.red; - if (GUILayout.Button("-", GUILayout.Width(20))) - { - group.FolderList.RemoveAt(i); - break; - } - GUI.color = deleteColor; - group.FolderList[i] = (DefaultAsset)EditorGUILayout.ObjectField(foldAsset, typeof(DefaultAsset), false); - } - EditorGUILayout.EndHorizontal(); - } - - //draw add Folder - var addFolderColor = GUI.color; - GUI.color = Color.yellow; - if (GUILayout.Button("添加资源目录")) - { - group.FolderList.Add(null); - } - GUI.color = addFolderColor; - } - EditorGUILayout.EndVertical(); - - } - EditorGUILayout.EndVertical(); - GUI.color = temp; - } - - //Draw Add Group Button - var addColor = GUI.color; - GUI.color = Color.yellow; - if (GUILayout.Button("添加组")) - { - builder.Groups.Add(new BuildEntity()); - } - GUI.color = addColor; - - EditorGUILayout.EndVertical(); - - if (GUI.changed) - { - MarkInBundleFiles.RefreshProjectBundleMark(); - EditorUtility.SetDirty(target); - } - - Color GetGroupColor(BuildEntity group, out string errorMsg) - { - errorMsg = null; - - if (string.IsNullOrWhiteSpace(group.GroupName)) - { - errorMsg = "非法名称"; - return Color.red; - } - if (builder.Groups.Count(item => item.GroupName == group.GroupName) > 1) - { - errorMsg = "名称重复"; - return Color.red; - } - if (group.FolderList.Count == 0) - { - errorMsg = "未包含任何目录"; - return Color.red; - } - if (group.FolderList.Count(f => f == null) > 0) - { - errorMsg = "存在无效目录"; - return Color.red; - } - - if (group.OptionBundle) return Color.cyan; - - return Color.white; - } - + + if (!patchLoader.Status) + { + EditorGUILayout.HelpBox(patchLoader.Status, MessageType.Error); + } + } + + private void DrawGroupItems() + { + Undo.RecordObject(target, target.name); + + EditorGUILayout.BeginVertical(); + + var builder = target as BuilderConfig; + builder.DuplicateBundleBeInstallBundle = EditorGUILayout.Toggle("重复依赖资源的bundle作为随包资源", builder.DuplicateBundleBeInstallBundle); + builder.ShaderBundleBeInstallBundle = EditorGUILayout.Toggle("shaderbundle作为随包资源", builder.ShaderBundleBeInstallBundle); + + foreach (var group in builder.Groups) + { + var temp = GUI.color; + + GUI.color = GetGroupColor(group, out var errorMsg); + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + { + EditorGUILayout.LabelField(errorMsg); + //Name And Optionnal + EditorGUILayout.BeginHorizontal(); + { + group.MarkColor = EditorGUILayout.ColorField("标记颜色", group.MarkColor); + group.GroupName = EditorGUILayout.TextField(group.GroupName, GUILayout.Width(100)); + + var groupDeleteColor = GUI.color; + GUI.color = Color.red; + if (GUILayout.Button("X", GUILayout.Width(30))) + { + builder.Groups.Remove(group); + break; + } + GUI.color = groupDeleteColor; + } + EditorGUILayout.EndHorizontal(); + + group.OptionBundle = EditorGUILayout.Toggle($"可选下载包", group.OptionBundle); + group.InstallReady = EditorGUILayout.Toggle($"跟随主包", group.InstallReady); + + //buildMode + EditorGUILayout.BeginHorizontal(); + { + var EnumType = typeof(BuildEntity.EnumBuildMode); + var values = Enum.GetValues(EnumType); + foreach (BuildEntity.EnumBuildMode modeValue in values) + { + var modeName = Enum.GetName(EnumType, modeValue); + + var tempColor = GUI.color; + if (modeValue == group.BuildMode) GUI.color = Color.green; + else GUI.color = Color.white; + if (GUILayout.Button(new GUIContent(modeName, GetDescrib(modeValue)))) + { + group.BuildMode = modeValue; + } + GUI.color = tempColor; + } + } + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginVertical(new GUIStyle { padding = new RectOffset(5, 5, 5, 5) }); + { + for (int i = 0; i < group.FolderList.Count; i++) + { + EditorGUILayout.BeginHorizontal(); + { + var foldAsset = group.FolderList[i]; + var deleteColor = GUI.color; + GUI.color = Color.red; + if (GUILayout.Button("-", GUILayout.Width(20))) + { + group.FolderList.RemoveAt(i); + break; + } + GUI.color = deleteColor; + group.FolderList[i] = (DefaultAsset)EditorGUILayout.ObjectField(foldAsset, typeof(DefaultAsset), false); + } + EditorGUILayout.EndHorizontal(); + } + + //draw add Folder + var addFolderColor = GUI.color; + GUI.color = Color.yellow; + if (GUILayout.Button("添加资源目录")) + { + group.FolderList.Add(null); + } + GUI.color = addFolderColor; + } + EditorGUILayout.EndVertical(); + + } + EditorGUILayout.EndVertical(); + GUI.color = temp; + } + + //Draw Add Group Button + var addColor = GUI.color; + GUI.color = Color.yellow; + if (GUILayout.Button("添加组")) + { + builder.Groups.Add(new BuildEntity()); + } + GUI.color = addColor; + + EditorGUILayout.EndVertical(); + + if (GUI.changed) + { + MarkInBundleFiles.RefreshProjectBundleMark(); + EditorUtility.SetDirty(target); + } + + Color GetGroupColor(BuildEntity group, out string errorMsg) + { + errorMsg = null; + + if (string.IsNullOrWhiteSpace(group.GroupName)) + { + errorMsg = "非法名称"; + return Color.red; + } + if (builder.Groups.Count(item => item.GroupName == group.GroupName) > 1) + { + errorMsg = "名称重复"; + return Color.red; + } + if (group.FolderList.Count == 0) + { + errorMsg = "未包含任何目录"; + return Color.red; + } + if (group.FolderList.Count(f => f == null) > 0) + { + errorMsg = "存在无效目录"; + return Color.red; + } + + if (group.OptionBundle) return Color.cyan; + + return Color.white; + } + string GetDescrib(T value) where T : Enum { var enumType = typeof(T); var desAtt = enumType.GetField(value.ToString()).GetCustomAttribute(); return desAtt != null ? desAtt.Description : value.ToString(); - } - } - - private void DrawCompareResult(List compareResult, Dictionary bundleExtraInfo) - { - EditorGUILayout.BeginVertical(EditorStyles.helpBox); - foreach (var item in compareResult.OrderBy(c => c.Result)) - { - if (item.Result == BundleCompare.EnumCompare.Same) continue; - EditorGUILayout.BeginHorizontal(); - string drawStr = null; - Color drawColor = Color.white; - - switch (item.Result) - { - case BundleCompare.EnumCompare.Same: - drawStr = "="; - drawColor = Color.black; - break; - case BundleCompare.EnumCompare.Modified: - drawColor = Color.yellow; - drawStr = "*"; - break; - case BundleCompare.EnumCompare.Add: - drawColor = Color.green; - drawStr = "+"; - break; - case BundleCompare.EnumCompare.Delete: - drawColor = Color.red; - drawStr = "-"; - break; - } - - drawStr += item.ToString(); - - var temp = GUI.color; - GUI.color = drawColor; - EditorGUILayout.LabelField($"{drawStr}"); - EditorGUILayout.EndHorizontal(); - GUI.color = temp; - } - EditorGUILayout.EndVertical(); - } - - public static (BundleManifest remoteVersion, string updateVersion) FetchRemoteVersion(BuilderConfig builder) - { - BundleManifest remoteVersion = null; - string updateVersion = null; - - var bc = builder; - var patchLoader = bc.GetPatchLoader(); - - var remoteManifestData = patchLoader.DownloadFile($"Bundles/{VersionFlowX.PlatformFoldName}/PatchManifest.json"); - if (remoteManifestData == null) - { - remoteVersion = new BundleManifest(); - remoteVersion.Version = "N/A"; - var now = DateTime.Now; - updateVersion = $"1.0.0.{now.Year:00}{now.Month:00}{now.Day:00}{now.Hour:00}{now.Minute:00}{now.Second:00}"; - } - else - { - var remoteJson = Encoding.ASCII.GetString(remoteManifestData); - var remoteManifest = BundleManifest.FromJson(remoteJson); - remoteVersion = remoteManifest; - var temp = remoteVersion.Version.Substring(0, remoteVersion.Version.LastIndexOf('.')); - var now = DateTime.Now; - updateVersion = $"{temp}.{now.Year:00}{now.Month:00}{now.Day:00}{now.Hour:00}{now.Minute:00}{now.Second:00}"; - } - - return (remoteVersion, updateVersion); - } - - public static void StartUpLoad(List compareResult, BundleManifest localManifest, string outputPath, PatchUploader uploader) - { - List bundlesToUpload = new List(); - List bundlesToDelete = new List(); - foreach (var item in compareResult) - { - if (item.Result == BundleCompare.EnumCompare.Same) continue; - - if (item.Result == BundleCompare.EnumCompare.Delete) - { - bundlesToDelete.Add(item.Old); - } - else - { - bundlesToUpload.Add(item.New); - } - } - - var tips = "****!!!确认上传信息!!!*****\n"; - - if (bundlesToUpload.Count == 0 && bundlesToDelete.Count == 0) - { - bool confirm = EditorUtility.DisplayDialog("FBI WARNING", $"CDN上没有需要更新的Bundle,将只更新版本号\n{tips}", "ok", "cancel"); - if (confirm) - { + } + } + + private void DrawCompareResult(List compareResult, Dictionary bundleExtraInfo) + { + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + foreach (var item in compareResult.OrderBy(c => c.Result)) + { + if (item.Result == BundleCompare.EnumCompare.Same) continue; + EditorGUILayout.BeginHorizontal(); + string drawStr = null; + Color drawColor = Color.white; + + switch (item.Result) + { + case BundleCompare.EnumCompare.Same: + drawStr = "="; + drawColor = Color.black; + break; + case BundleCompare.EnumCompare.Modified: + drawColor = Color.yellow; + drawStr = "*"; + break; + case BundleCompare.EnumCompare.Add: + drawColor = Color.green; + drawStr = "+"; + break; + case BundleCompare.EnumCompare.Delete: + drawColor = Color.red; + drawStr = "-"; + break; + } + + drawStr += item.ToString(); + + var temp = GUI.color; + GUI.color = drawColor; + EditorGUILayout.LabelField($"{drawStr}"); + EditorGUILayout.EndHorizontal(); + GUI.color = temp; + } + EditorGUILayout.EndVertical(); + } + + public static (BundleManifest remoteVersion, string updateVersion) FetchRemoteVersion(BuilderConfig builder) + { + BundleManifest remoteVersion = null; + string updateVersion = null; + + var bc = builder; + var patchLoader = bc.GetPatchLoader(); + + var remoteManifestData = patchLoader.DownloadFile($"Bundles/{VersionFlowX.PlatformFoldName}/PatchManifest.json"); + if (remoteManifestData == null) + { + remoteVersion = new BundleManifest(); + remoteVersion.Version = "N/A"; + var now = DateTime.Now; + updateVersion = $"1.0.0.{now.Year:00}{now.Month:00}{now.Day:00}{now.Hour:00}{now.Minute:00}{now.Second:00}"; + } + else + { + var remoteJson = Encoding.ASCII.GetString(remoteManifestData); + var remoteManifest = BundleManifest.FromJson(remoteJson); + remoteVersion = remoteManifest; + var temp = remoteVersion.Version.Substring(0, remoteVersion.Version.LastIndexOf('.')); + var now = DateTime.Now; + updateVersion = $"{temp}.{now.Year:00}{now.Month:00}{now.Day:00}{now.Hour:00}{now.Minute:00}{now.Second:00}"; + } + + return (remoteVersion, updateVersion); + } + + public static void StartUpLoad(List compareResult, BundleManifest localManifest, string outputPath, PatchUploader uploader) + { + List bundlesToUpload = new List(); + List bundlesToDelete = new List(); + foreach (var item in compareResult) + { + if (item.Result == BundleCompare.EnumCompare.Same) continue; + + if (item.Result == BundleCompare.EnumCompare.Delete) + { + bundlesToDelete.Add(item.Old); + } + else + { + bundlesToUpload.Add(item.New); + } + } + + var tips = "****!!!确认上传信息!!!*****\n"; + + if (bundlesToUpload.Count == 0 && bundlesToDelete.Count == 0) + { + bool confirm = EditorUtility.DisplayDialog("FBI WARNING", $"CDN上没有需要更新的Bundle,将只更新版本号\n{tips}", "ok", "cancel"); + if (confirm) + { var newVersionFile = new MemoryStream(Encoding.ASCII.GetBytes(localManifest.ToJson())); - uploader.UploadFile($"Bundles/{VersionFlowX.PlatformFoldName}/PatchManifest.json", newVersionFile); - var cdnPerformer = uploader as ICDNPerformer; - cdnPerformer?.CDNRefresh(new string[] { "PatchManifest.json" }); - } - return; - } - - var totalSize = bundlesToUpload.Sum(b => b.Size); - var totalSizeStr = $"{totalSize}b"; - if (totalSize > 1024 * 1024) - { - totalSizeStr = $"{totalSize / 1024f / 1024f:.00}mb"; - } - else if (totalSize > 1024) - { - totalSizeStr = $"{totalSize / 1024f:.00}kb"; - } - - bool res = EditorUtility.DisplayDialog("FBI WARNING", $"本次需上传{bundlesToUpload.Count}个Bundle\n总大小为{totalSizeStr}\n{tips}", "ok", "cancel"); - if (!res) return; - - int max = bundlesToUpload.Count + 1; - int step = 0; - foreach (var bundle in bundlesToUpload) - { + uploader.UploadFile($"Bundles/{VersionFlowX.PlatformFoldName}/PatchManifest.json", newVersionFile); + var cdnPerformer = uploader as ICDNPerformer; + cdnPerformer?.CDNRefresh(new string[] { "PatchManifest.json" }); + } + return; + } + + var totalSize = bundlesToUpload.Sum(b => b.Size); + var totalSizeStr = $"{totalSize}b"; + if (totalSize > 1024 * 1024) + { + totalSizeStr = $"{totalSize / 1024f / 1024f:.00}mb"; + } + else if (totalSize > 1024) + { + totalSizeStr = $"{totalSize / 1024f:.00}kb"; + } + + bool res = EditorUtility.DisplayDialog("FBI WARNING", $"本次需上传{bundlesToUpload.Count}个Bundle\n总大小为{totalSizeStr}\n{tips}", "ok", "cancel"); + if (!res) return; + + int max = bundlesToUpload.Count + 1; + int step = 0; + foreach (var bundle in bundlesToUpload) + { EditorUtility.DisplayProgressBar("上传", $"{bundle.BundleName}", step * 1f / max); var bundleFilePath = $"{outputPath}/{bundle.BundleName}"; string remoteFilePath = null; @@ -410,100 +415,100 @@ namespace VersionFlow.Editors remoteFilePath = $"Bundles/{VersionFlowX.PlatformFoldName}/{fileName}.{bundle.Hash}{ext}"; - uploader.UploadFile(remoteFilePath, fileSt); - - step++; - } - - EditorUtility.DisplayProgressBar("上传", $"上传PatchManifest.json", step * 1f / max); - var st = new MemoryStream(Encoding.ASCII.GetBytes(localManifest.ToJson())); - uploader.UploadFile($"Bundles/{VersionFlowX.PlatformFoldName}/PatchManifest.json", st); - (uploader as ICDNPerformer)?.CDNRefresh(new string[] { $"Bundles/{VersionFlowX.PlatformFoldName}/PatchManifest.json" }); - - if (bundlesToDelete.Count > 0) - { - max = bundlesToDelete.Count + 1; - step = 0; - foreach (var bundle in bundlesToDelete) - { + uploader.UploadFile(remoteFilePath, fileSt); + + step++; + } + + EditorUtility.DisplayProgressBar("上传", $"上传PatchManifest.json", step * 1f / max); + var st = new MemoryStream(Encoding.ASCII.GetBytes(localManifest.ToJson())); + uploader.UploadFile($"Bundles/{VersionFlowX.PlatformFoldName}/PatchManifest.json", st); + (uploader as ICDNPerformer)?.CDNRefresh(new string[] { $"Bundles/{VersionFlowX.PlatformFoldName}/PatchManifest.json" }); + + if (bundlesToDelete.Count > 0) + { + max = bundlesToDelete.Count + 1; + step = 0; + foreach (var bundle in bundlesToDelete) + { EditorUtility.DisplayProgressBar("移除冗余bundle", $"{bundle.BundleName}", step * 1f / max); - var temp = Path.GetFileNameWithoutExtension(bundle.BundleName); - var ext = Path.GetExtension(bundle.BundleName); + var temp = Path.GetFileNameWithoutExtension(bundle.BundleName); + var ext = Path.GetExtension(bundle.BundleName); string bundlePath = $"Bundles/{VersionFlowX.PlatformFoldName}/{temp}.{bundle.Hash}{ext}"; uploader.DeleteFile(bundlePath); - step++; - } - } - - EditorUtility.ClearProgressBar(); - } - - public static void CalcBundleHash(string bundleOutputPath, List buildInfoList, Dictionary bundleExtraInfo, AssetBundleManifest report) - { - var bundleNames = report.GetAllAssetBundles(); - int total = bundleNames.Length; - - int step = 0; - foreach (var bundleName in bundleNames) - { - var hash = report.GetAssetBundleHash(bundleName); - bundleExtraInfo[bundleName].BundleHash = hash; - - step++; - - EditorUtility.DisplayProgressBar("算hash", $"{step}/{total}", step / total * 1f); - } - - EditorUtility.ClearProgressBar(); - } - - public static void SetInstallBundles(BuilderConfig builder, bool force) - { - if (Directory.Exists($"{Application.streamingAssetsPath}/Bundles")) - Directory.Delete($"{Application.streamingAssetsPath}/Bundles", true); - - //获取oss上的bundle清单 - var remoteInfo = FetchRemoteVersion(builder); - - //收集定义为随包资源的bundle - List installBundles = new List(); - foreach (var bundle in remoteInfo.remoteVersion.Bundles) - { - if (force) installBundles.Add(bundle); - else if (bundle.InstallBundle) installBundles.Add(bundle); - } - - if (installBundles.Count > 0) - { - Directory.CreateDirectory($"{Application.streamingAssetsPath}/Bundles"); - BundleManifest installManifest = new BundleManifest(); - installManifest.Version = remoteInfo.remoteVersion.Version; - int i = 0; - - var patchLoader = builder.GetPatchLoader(); - - foreach (var bundle in installBundles) - { - EditorUtility.DisplayProgressBar("处理随包资源", $"{bundle.BundleName}", i * 1f / installBundles.Count); - - var ext = Path.GetExtension(bundle.BundleName); - var fileName = Path.GetFileNameWithoutExtension(bundle.BundleName); - var fileNameInOSS = $"{fileName}.{bundle.Hash}{ext}"; - - var bundleData = patchLoader.DownloadFile($"Bundles/{VersionFlowX.PlatformFoldName}/{fileNameInOSS}"); - - File.WriteAllBytes($"{Application.streamingAssetsPath}/Bundles/{bundle.BundleName}", bundleData); - installManifest.UpdateBundleData(bundle); - i++; - } - - File.WriteAllText($"{Application.streamingAssetsPath}/Bundles/InstallPatchManifest.json", installManifest.ToJson()); - } - - EditorUtility.ClearProgressBar(); - - AssetDatabase.Refresh(); - } - } + step++; + } + } + + EditorUtility.ClearProgressBar(); + } + + public static void CalcBundleHash(string bundleOutputPath, List buildInfoList, Dictionary bundleExtraInfo, AssetBundleManifest report) + { + var bundleNames = report.GetAllAssetBundles(); + int total = bundleNames.Length; + + int step = 0; + foreach (var bundleName in bundleNames) + { + var hash = report.GetAssetBundleHash(bundleName); + bundleExtraInfo[bundleName].BundleHash = hash; + + step++; + + EditorUtility.DisplayProgressBar("算hash", $"{step}/{total}", step / total * 1f); + } + + EditorUtility.ClearProgressBar(); + } + + public static void SetInstallBundles(BuilderConfig builder, bool force) + { + if (Directory.Exists($"{Application.streamingAssetsPath}/Bundles")) + Directory.Delete($"{Application.streamingAssetsPath}/Bundles", true); + + //获取oss上的bundle清单 + var remoteInfo = FetchRemoteVersion(builder); + + //收集定义为随包资源的bundle + List installBundles = new List(); + foreach (var bundle in remoteInfo.remoteVersion.Bundles) + { + if (force) installBundles.Add(bundle); + else if (bundle.InstallBundle) installBundles.Add(bundle); + } + + if (installBundles.Count > 0) + { + Directory.CreateDirectory($"{Application.streamingAssetsPath}/Bundles"); + BundleManifest installManifest = new BundleManifest(); + installManifest.Version = remoteInfo.remoteVersion.Version; + int i = 0; + + var patchLoader = builder.GetPatchLoader(); + + foreach (var bundle in installBundles) + { + EditorUtility.DisplayProgressBar("处理随包资源", $"{bundle.BundleName}", i * 1f / installBundles.Count); + + var ext = Path.GetExtension(bundle.BundleName); + var fileName = Path.GetFileNameWithoutExtension(bundle.BundleName); + var fileNameInOSS = $"{fileName}.{bundle.Hash}{ext}"; + + var bundleData = patchLoader.DownloadFile($"Bundles/{VersionFlowX.PlatformFoldName}/{fileNameInOSS}"); + + File.WriteAllBytes($"{Application.streamingAssetsPath}/Bundles/{bundle.BundleName}", bundleData); + installManifest.UpdateBundleData(bundle); + i++; + } + + File.WriteAllText($"{Application.streamingAssetsPath}/Bundles/InstallPatchManifest.json", installManifest.ToJson()); + } + + EditorUtility.ClearProgressBar(); + + AssetDatabase.Refresh(); + } + } } \ No newline at end of file diff --git a/Assets/VersionFlow/Editor/MsgBool.cs b/Assets/VersionFlow/Editor/MsgBool.cs new file mode 100644 index 0000000..a329600 --- /dev/null +++ b/Assets/VersionFlow/Editor/MsgBool.cs @@ -0,0 +1,93 @@ +namespace VersionFlow.Editors +{ + /// + /// String和Bool的缝合怪 + /// + public struct MsgBool + { + public string ErrorMsg; + public bool Value; + + public override readonly string ToString() + { + if (Value) + { + return true.ToString(); + } + else + { + return ErrorMsg; + } + } + + public static implicit operator MsgBool(string errorMsg) + { + return new MsgBool { Value = false, ErrorMsg = errorMsg }; + } + + public static implicit operator MsgBool(bool value) + { + return new MsgBool { Value = value }; + } + + public static implicit operator bool(MsgBool msgBool) + { + return msgBool.Value; + } + + public static implicit operator (bool, string)(MsgBool msgBool) + { + return (msgBool.Value, msgBool.ErrorMsg); + } + + public static implicit operator string(MsgBool msgBool) + { + return msgBool.ToString(); + } + } + + public struct MsgBool + { + public string ErrorMsg; + public bool Value; + public T Result; + + public override readonly string ToString() + { + if (Value) + { + if (Result != null) return Result.ToString(); + return true.ToString(); + } + else + { + return ErrorMsg; + } + } + + public static implicit operator MsgBool(string errorMsg) + { + return new MsgBool { Value = false, ErrorMsg = errorMsg }; + } + + public static implicit operator MsgBool(bool value) + { + return new MsgBool { Value = value }; + } + + public static implicit operator MsgBool(T result) + { + return new MsgBool { Value = true, Result = result }; + } + + public static implicit operator bool(MsgBool msgBool) + { + return msgBool.Value; + } + + public static implicit operator string(MsgBool msgBool) + { + return msgBool.ToString(); + } + } +} \ No newline at end of file diff --git a/Assets/VersionFlow/Editor/MsgBool.cs.meta b/Assets/VersionFlow/Editor/MsgBool.cs.meta new file mode 100644 index 0000000..b6f0131 --- /dev/null +++ b/Assets/VersionFlow/Editor/MsgBool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d23328d75cc93354ea1a595833f504a2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VersionFlow/Editor/PatchUploader/PatchUploader.cs b/Assets/VersionFlow/Editor/PatchUploader/PatchUploader.cs index 2a59e75..785c710 100644 --- a/Assets/VersionFlow/Editor/PatchUploader/PatchUploader.cs +++ b/Assets/VersionFlow/Editor/PatchUploader/PatchUploader.cs @@ -7,6 +7,7 @@ namespace VersionFlow.Editors { public abstract class PatchUploader : ScriptableObject { + public abstract MsgBool Status { get; } public PatchUploader() { } public abstract void CfgChanged(BuilderConfig builder, string cfgJson); public abstract void UploadFile(string remoteFilePath, MemoryStream localfileStream); @@ -21,17 +22,20 @@ namespace VersionFlow.Editors [SerializeField] protected CONFIG m_cfg; + MsgBool m_status; + public override MsgBool Status => m_status; + public sealed override void CfgChanged(BuilderConfig builder, string cfgJson) { m_builder = builder; try { m_cfg = JsonUtility.FromJson(cfgJson); - OnCfgChanged(); + m_status = OnCfgChanged(); } catch (Exception ex) { - Debug.LogError(ex); + m_status = ex.Message; } } @@ -40,6 +44,6 @@ namespace VersionFlow.Editors return JsonUtility.ToJson(m_cfg); } - protected abstract void OnCfgChanged(); + protected abstract MsgBool OnCfgChanged(); } } \ No newline at end of file diff --git a/Assets/VersionFlow/Editor/PatchUploader/PatchUploaderImpl/PatchUpLoader_AliOSS.cs b/Assets/VersionFlow/Editor/PatchUploader/PatchUploaderImpl/PatchUpLoader_AliOSS.cs index 483db20..b386090 100644 --- a/Assets/VersionFlow/Editor/PatchUploader/PatchUploaderImpl/PatchUpLoader_AliOSS.cs +++ b/Assets/VersionFlow/Editor/PatchUploader/PatchUploaderImpl/PatchUpLoader_AliOSS.cs @@ -23,17 +23,20 @@ namespace VersionFlow.Editors private OssClient m_ossClient; private Client m_cdnClient; - protected override void OnCfgChanged() + protected override MsgBool OnCfgChanged() { + if (string.IsNullOrWhiteSpace(m_cfg.BucketName)) return "BucketName无效"; + if (string.IsNullOrWhiteSpace(m_cfg.UploadPath)) return "UploadPath无效"; + try { m_ossClient = new OssClient(m_cfg.endPoint, m_cfg.accessKeyId, m_cfg.accessKeySecret); m_cdnClient = new Client(new AlibabaCloud.OpenApiClient.Models.Config { AccessKeyId = m_cfg.accessKeyId, AccessKeySecret = m_cfg.accessKeySecret }); - Debug.Log("AliOSS SDK 初始化成功"); + return true; } catch { - Debug.LogError("AliOSS SDK 初始化失败,请检查相关参数配置"); + return "AliOSS SDK 初始化失败,请检查相关参数配置"; } } diff --git a/Assets/VersionFlow/Editor/PatchUploader/PatchUploaderImpl/PatchUploader_LocalFileSystem.cs b/Assets/VersionFlow/Editor/PatchUploader/PatchUploaderImpl/PatchUploader_LocalFileSystem.cs index 1c214af..d35fc6e 100644 --- a/Assets/VersionFlow/Editor/PatchUploader/PatchUploaderImpl/PatchUploader_LocalFileSystem.cs +++ b/Assets/VersionFlow/Editor/PatchUploader/PatchUploaderImpl/PatchUploader_LocalFileSystem.cs @@ -8,7 +8,10 @@ namespace VersionFlow.Editors [Description("本地文件系统")] public class PatchUploader_LocalFileSystem : PatchUploader, IAsyncDownloader { - protected override void OnCfgChanged() { } + protected override MsgBool OnCfgChanged() + { + return true; + } public override void UploadFile(string remoteFilePath, MemoryStream localfileStream) { diff --git a/Assets/VersionFlow/Editor/VersionFlowSettingWnd.cs b/Assets/VersionFlow/Editor/VersionFlowSettingWnd.cs index ca5fd5c..cfda22c 100644 --- a/Assets/VersionFlow/Editor/VersionFlowSettingWnd.cs +++ b/Assets/VersionFlow/Editor/VersionFlowSettingWnd.cs @@ -1,4 +1,5 @@ -using UnityEditor; +using System; +using UnityEditor; using UnityEngine; using VersionFlow.Runtime; @@ -32,23 +33,42 @@ namespace VersionFlow.Editors private void OnGUI() { EditorGUILayout.BeginHorizontal(); - if (GUILayout.Toggle(m_currentEditor == m_builderEditor, "上传设置", GUI.skin.button)) { - m_currentEditor = m_builderEditor; - } - if (GUILayout.Toggle(m_currentEditor == m_settingEditor, "运行时设置", GUI.skin.button)) - { - m_currentEditor = m_settingEditor; - } - EditorGUILayout.EndVertical(); + EditorGUILayout.BeginVertical(GUILayout.Width(200)); + { + DrawEditorTabRegion(); + } + EditorGUILayout.EndVertical(); - EditorGUILayout.BeginVertical(EditorStyles.helpBox); - { - m_builderEditorScroll = EditorGUILayout.BeginScrollView(m_builderEditorScroll); - m_currentEditor.OnInspectorGUI(); - EditorGUILayout.EndScrollView(); + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + { + m_builderEditorScroll = EditorGUILayout.BeginScrollView(m_builderEditorScroll); + DrawSelectEditor(); + EditorGUILayout.EndScrollView(); + } + EditorGUILayout.EndVertical(); + } + EditorGUILayout.EndHorizontal(); + + } + + private void DrawSelectEditor() + { + m_currentEditor.OnInspectorGUI(); + } + + private void DrawEditorTabRegion() + { + DrawEditorTabItem(m_builderEditor, "上传设置"); + DrawEditorTabItem(m_settingEditor, "运行时设置"); + + void DrawEditorTabItem(Editor targetEditor, string name) + { + if (GUILayout.Toggle(m_currentEditor == targetEditor, name, new GUIStyle(GUI.skin.button) { margin = new RectOffset() }, GUILayout.Height(40))) + { + m_currentEditor = targetEditor; + } } - EditorGUILayout.EndVertical(); } } } \ No newline at end of file