添加打包配置页,将原上传配置页相关功能移动到打包配置页

This commit is contained in:
Alienjack 2025-09-03 18:57:52 +08:00
parent 7cb3596c4e
commit 29a8705ef8
9 changed files with 259 additions and 214 deletions

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a1d01bcac8137274ab74956daabe5cac
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,67 @@
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
{
public override void OnInspectorGUI()
{
DrawUploader();
}
Dictionary<PatchUploader, Editor> m_uploaderEditorMapper = new Dictionary<PatchUploader, Editor>();
private void DrawUploader()
{
var builder = target as BuilderConfig;
var uploaderTypes = builder.GetAllPatcherType();
var options = uploaderTypes.Select(t => $"{t.Namespace}.{t.Name}").ToList();
var selectIndex = options.IndexOf(builder.uploaderClassName);
selectIndex = EditorGUILayout.Popup("选择上传器", selectIndex, options.Select(op => PatchUploaderUtility.GetPatcherPrettyName(op)).ToArray());
if (selectIndex != -1)
{
var selectClassName = options[selectIndex];
builder.uploaderClassName = selectClassName;
}
var patchLoader = builder.GetPatchLoader();
if (patchLoader != null)
{
if (!m_uploaderEditorMapper.TryGetValue(patchLoader, out Editor editor))
{
editor = Editor.CreateEditor(patchLoader);
m_uploaderEditorMapper[patchLoader] = editor;
}
editor.OnInspectorGUI();
string json = patchLoader.GetCfgJson();
builder.UploaderCfgDict.SetCfgJson(patchLoader.GetType(), json);
}
if (GUI.changed)
{
EditorUtility.SetDirty(target);
patchLoader.CfgChanged(builder, builder.UploaderCfgDict.GetUploaderCfg(patchLoader.GetType()));
}
if (!patchLoader.Status)
{
EditorGUILayout.HelpBox(patchLoader.Status, MessageType.Error);
}
}
}
}

View File

@ -11,33 +11,20 @@ using VersionFlow.Runtime;
namespace VersionFlow.Editors
{
[CustomEditor(typeof(BuilderConfig))]
public class BuilderConfigEditor : Editor
public class PackEditor : Editor
{
static bool FoldOutGroup;
static private BundleManifest RemoteVersion;
static private string UpdateVersion;
static public BundleManifest Report;
static private List<BundleCompare> CompareResult;
static private string outputPath;
static private Dictionary<string, BundleExtraInfo> bundleExtraInfo;
static bool FoldOutGroup;
static public BundleManifest Report;
private static void ResetState()
{
RemoteVersion = null;
UpdateVersion = null;
Report = null;
CompareResult = null;
outputPath = null;
bundleExtraInfo = null;
}
public override void OnInspectorGUI()
{
DrawUploader();
var builder = target as BuilderConfig;
EditorGUILayout.Space(20);
@ -68,7 +55,7 @@ namespace VersionFlow.Editors
if (CompareResult == null && GUILayout.Button("Build"))
{
var bc = (BuilderConfig)target;
bc.OnCalcBundleHash = BuilderConfigEditor.CalcBundleHash;
bc.OnCalcBundleHash = CalcBundleHash;
Report = bc.Build(UpdateVersion, out outputPath, out bundleExtraInfo);
CompareResult = bc.CompareBundleManifest(Report, RemoteVersion);
}
@ -86,201 +73,6 @@ namespace VersionFlow.Editors
}
}
Dictionary<PatchUploader, Editor> m_uploaderEditorMapper = new Dictionary<PatchUploader, Editor>();
private void DrawUploader()
{
var builder = target as BuilderConfig;
var uploaderTypes = builder.GetAllPatcherType();
var options = uploaderTypes.Select(t => $"{t.Namespace}.{t.Name}").ToList();
var selectIndex = options.IndexOf(builder.uploaderClassName);
selectIndex = EditorGUILayout.Popup("选择上传器", selectIndex, options.Select(op => PatchUploaderUtility.GetPatcherPrettyName(op)).ToArray());
if (selectIndex != -1)
{
var selectClassName = options[selectIndex];
builder.uploaderClassName = selectClassName;
}
var patchLoader = builder.GetPatchLoader();
if (patchLoader != null)
{
if (!m_uploaderEditorMapper.TryGetValue(patchLoader, out Editor editor))
{
editor = Editor.CreateEditor(patchLoader);
m_uploaderEditorMapper[patchLoader] = editor;
}
editor.OnInspectorGUI();
string json = patchLoader.GetCfgJson();
builder.UploaderCfgDict.SetCfgJson(patchLoader.GetType(), json);
}
if (GUI.changed)
{
EditorUtility.SetDirty(target);
patchLoader.CfgChanged(builder, builder.UploaderCfgDict.GetUploaderCfg(patchLoader.GetType()));
}
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>(T value) where T : Enum
{
var enumType = typeof(T);
var desAtt = enumType.GetField(value.ToString()).GetCustomAttribute<DescriptionAttribute>();
return desAtt != null ? desAtt.Description : value.ToString();
}
}
private void DrawCompareResult(List<BundleCompare> compareResult, Dictionary<string, BundleExtraInfo> bundleExtraInfo)
{
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
@ -508,5 +300,167 @@ namespace VersionFlow.Editors
AssetDatabase.Refresh();
}
private static void ResetState()
{
RemoteVersion = null;
UpdateVersion = null;
Report = null;
CompareResult = null;
outputPath = null;
bundleExtraInfo = null;
}
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>(T value) where T : Enum
{
var enumType = typeof(T);
var desAtt = enumType.GetField(value.ToString()).GetCustomAttribute<DescriptionAttribute>();
return desAtt != null ? desAtt.Description : value.ToString();
}
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 390bca0e4e3f95c478211fc551302829
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -163,7 +163,7 @@ namespace VersionFlow.Editors
fetchBundles.Clear();
var builder = PatchUploaderUtility.FindBuilderInProject();
m_remoteInfo = BuilderConfigEditor.FetchRemoteVersion(builder);
m_remoteInfo = PackEditor.FetchRemoteVersion(builder);
foreach (var bundle in m_remoteInfo.remoteVersion.Bundles)
{

View File

@ -8,8 +8,11 @@ namespace VersionFlow.Editors
public class VersionFlowSettingWnd : EditorWindow
{
private BuilderConfig m_builder;
private Editor m_packEditor;
private Editor m_builderEditor;
private Editor m_settingEditor;
private Vector2 m_builderEditorScroll;
[MenuItem("VersionFlow/Setting", priority = int.MinValue)]
@ -24,6 +27,7 @@ namespace VersionFlow.Editors
titleContent = new GUIContent("VersionFlow");
m_builder = PatchUploaderUtility.FindBuilderInProject();
m_packEditor = Editor.CreateEditor(m_builder, typeof(PackEditor));
m_builderEditor = Editor.CreateEditor(m_builder);
m_settingEditor = Editor.CreateEditor(m_builder.vfSetting);
@ -60,6 +64,7 @@ namespace VersionFlow.Editors
private void DrawEditorTabRegion()
{
DrawEditorTabItem(m_packEditor, "打包设置");
DrawEditorTabItem(m_builderEditor, "上传设置");
DrawEditorTabItem(m_settingEditor, "运行时设置");