mirror of
https://github.com/wechat-miniprogram/minigame-tuanjie-transform-sdk.git
synced 2026-04-22 01:35:56 +08:00
274 lines
12 KiB
C#
274 lines
12 KiB
C#
using UnityEngine;
|
||
using UnityEditor;
|
||
using System.IO;
|
||
using System;
|
||
|
||
namespace WeChatWASM
|
||
{
|
||
/// <summary>
|
||
/// 多包融合工具面板
|
||
/// UI层实现,业务逻辑调用 WXMultiPackageMergeCore
|
||
/// 纯C#实现,无需Node.js
|
||
/// </summary>
|
||
public class WXMultiPackageMergeWindow : EditorWindow
|
||
{
|
||
// 开发调试插件ID,由 preview:robot 自动更新
|
||
private const string DevPluginId = "fa0437c7ef2edbeccceea93cec2b68d6";
|
||
private static WXEditorScriptObject config;
|
||
private Vector2 scrollPosition;
|
||
private bool foldStPackage = true;
|
||
private bool foldMtPackage = true;
|
||
private bool foldMergeOptions = true;
|
||
private bool foldAdvancedOptions = true;
|
||
|
||
[MenuItem("微信小游戏 / 多包融合工具", false, 2)]
|
||
public static void Open()
|
||
{
|
||
var win = GetWindow(typeof(WXMultiPackageMergeWindow), false, "多包融合工具");
|
||
win.minSize = new Vector2(500, 600);
|
||
win.position = new Rect(100, 100, 700, 800);
|
||
win.Show();
|
||
}
|
||
|
||
private void OnEnable()
|
||
{
|
||
LoadConfig();
|
||
}
|
||
|
||
private void OnFocus()
|
||
{
|
||
LoadConfig();
|
||
}
|
||
|
||
private void LoadConfig()
|
||
{
|
||
if (config == null)
|
||
{
|
||
config = UnityUtil.GetEditorConf();
|
||
}
|
||
if (config.MultiPackageMerge == null)
|
||
{
|
||
config.MultiPackageMerge = new MultiPackageMergeConfig();
|
||
}
|
||
}
|
||
|
||
private void SaveConfig()
|
||
{
|
||
if (config != null)
|
||
{
|
||
EditorUtility.SetDirty(config);
|
||
}
|
||
}
|
||
|
||
public void OnGUI()
|
||
{
|
||
LoadConfig();
|
||
|
||
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
|
||
|
||
GUILayout.Space(10);
|
||
EditorGUILayout.LabelField("多包融合工具", new GUIStyle(EditorStyles.largeLabel) { fontSize = 18, fontStyle = FontStyle.Bold });
|
||
EditorGUILayout.LabelField("将单线程包(ST)和多线程包(MT)融合为一个支持多线程的小游戏", EditorStyles.wordWrappedLabel);
|
||
GUILayout.Space(10);
|
||
|
||
// ST包配置
|
||
foldStPackage = EditorGUILayout.Foldout(foldStPackage, "ST包配置 (单线程包)", true, EditorStyles.foldoutHeader);
|
||
if (foldStPackage)
|
||
{
|
||
EditorGUILayout.BeginVertical("box");
|
||
|
||
EditorGUILayout.LabelField("ST包路径", EditorStyles.boldLabel);
|
||
EditorGUILayout.BeginHorizontal();
|
||
config.MultiPackageMerge.stPackagePath = EditorGUILayout.TextField(config.MultiPackageMerge.stPackagePath);
|
||
if (GUILayout.Button("选择", GUILayout.Width(60)))
|
||
{
|
||
string path = EditorUtility.OpenFolderPanel("选择ST包目录", config.MultiPackageMerge.stPackagePath, "");
|
||
if (!string.IsNullOrEmpty(path))
|
||
{
|
||
config.MultiPackageMerge.stPackagePath = path;
|
||
SaveConfig();
|
||
}
|
||
}
|
||
if (GUILayout.Button("打开", GUILayout.Width(60)) && !string.IsNullOrEmpty(config.MultiPackageMerge.stPackagePath) && Directory.Exists(config.MultiPackageMerge.stPackagePath))
|
||
{
|
||
EditorUtility.RevealInFinder(config.MultiPackageMerge.stPackagePath);
|
||
}
|
||
EditorGUILayout.EndHorizontal();
|
||
|
||
GUILayout.Space(5);
|
||
EditorGUILayout.LabelField("ST构建模式", EditorStyles.boldLabel);
|
||
string[] stModes = new string[] { "standard (标准模式)", "split (代码分包模式)" };
|
||
int stModeIndex = config.MultiPackageMerge.stMode == "split" ? 1 : 0;
|
||
stModeIndex = EditorGUILayout.Popup(stModeIndex, stModes);
|
||
config.MultiPackageMerge.stMode = stModeIndex == 1 ? "split" : "standard";
|
||
|
||
EditorGUILayout.EndVertical();
|
||
}
|
||
|
||
GUILayout.Space(10);
|
||
|
||
// MT包配置
|
||
foldMtPackage = EditorGUILayout.Foldout(foldMtPackage, "MT包配置 (多线程包)", true, EditorStyles.foldoutHeader);
|
||
if (foldMtPackage)
|
||
{
|
||
EditorGUILayout.BeginVertical("box");
|
||
|
||
EditorGUILayout.LabelField("MT包路径", EditorStyles.boldLabel);
|
||
EditorGUILayout.BeginHorizontal();
|
||
config.MultiPackageMerge.mtPackagePath = EditorGUILayout.TextField(config.MultiPackageMerge.mtPackagePath);
|
||
if (GUILayout.Button("选择", GUILayout.Width(60)))
|
||
{
|
||
string path = EditorUtility.OpenFolderPanel("选择MT包目录", config.MultiPackageMerge.mtPackagePath, "");
|
||
if (!string.IsNullOrEmpty(path))
|
||
{
|
||
config.MultiPackageMerge.mtPackagePath = path;
|
||
SaveConfig();
|
||
}
|
||
}
|
||
if (GUILayout.Button("打开", GUILayout.Width(60)) && !string.IsNullOrEmpty(config.MultiPackageMerge.mtPackagePath) && Directory.Exists(config.MultiPackageMerge.mtPackagePath))
|
||
{
|
||
EditorUtility.RevealInFinder(config.MultiPackageMerge.mtPackagePath);
|
||
}
|
||
EditorGUILayout.EndHorizontal();
|
||
|
||
EditorGUILayout.EndVertical();
|
||
}
|
||
|
||
GUILayout.Space(10);
|
||
|
||
// 融合选项
|
||
foldMergeOptions = EditorGUILayout.Foldout(foldMergeOptions, "融合选项", true, EditorStyles.foldoutHeader);
|
||
if (foldMergeOptions)
|
||
{
|
||
EditorGUILayout.BeginVertical("box");
|
||
|
||
EditorGUILayout.LabelField("融合模式", EditorStyles.boldLabel);
|
||
string[] mergeModes = new string[] { "standard (标准融合)", "seperateJsCode (JS分离模式)" };
|
||
int mergeModeIndex = config.MultiPackageMerge.mergeMode == "seperateJsCode" ? 1 : 0;
|
||
mergeModeIndex = EditorGUILayout.Popup(mergeModeIndex, mergeModes);
|
||
config.MultiPackageMerge.mergeMode = mergeModeIndex == 1 ? "seperateJsCode" : "standard";
|
||
|
||
// 分离文件列表和存放方式已注释,使用默认的 topDir 模式
|
||
// if (config.MultiPackageMerge.mergeMode == "seperateJsCode")
|
||
// {
|
||
// GUILayout.Space(5);
|
||
// EditorGUILayout.LabelField("分离文件列表 (逗号分隔)", EditorStyles.boldLabel);
|
||
// config.MultiPackageMerge.seperateFileList = EditorGUILayout.TextField(config.MultiPackageMerge.seperateFileList);
|
||
//
|
||
// GUILayout.Space(5);
|
||
// EditorGUILayout.LabelField("分离文件存放方式", EditorStyles.boldLabel);
|
||
// string[] seperateModes = new string[] { "subDir (子目录)", "topDir (顶层目录)" };
|
||
// int seperateModeIndex = config.MultiPackageMerge.seperateMode == "topDir" ? 1 : 0;
|
||
// seperateModeIndex = EditorGUILayout.Popup(seperateModeIndex, seperateModes);
|
||
// config.MultiPackageMerge.seperateMode = seperateModeIndex == 1 ? "topDir" : "subDir";
|
||
// }
|
||
// 强制使用 topDir 模式
|
||
config.MultiPackageMerge.seperateMode = "topDir";
|
||
|
||
GUILayout.Space(5);
|
||
EditorGUILayout.LabelField("输出目录", EditorStyles.boldLabel);
|
||
EditorGUILayout.BeginHorizontal();
|
||
config.MultiPackageMerge.outputPath = EditorGUILayout.TextField(config.MultiPackageMerge.outputPath);
|
||
if (GUILayout.Button("选择", GUILayout.Width(60)))
|
||
{
|
||
string path = EditorUtility.OpenFolderPanel("选择输出目录", config.MultiPackageMerge.outputPath, "");
|
||
if (!string.IsNullOrEmpty(path))
|
||
{
|
||
config.MultiPackageMerge.outputPath = path;
|
||
SaveConfig();
|
||
}
|
||
}
|
||
if (GUILayout.Button("打开", GUILayout.Width(60)) && !string.IsNullOrEmpty(config.MultiPackageMerge.outputPath) && Directory.Exists(config.MultiPackageMerge.outputPath))
|
||
{
|
||
EditorUtility.RevealInFinder(config.MultiPackageMerge.outputPath);
|
||
}
|
||
EditorGUILayout.EndHorizontal();
|
||
|
||
EditorGUILayout.EndVertical();
|
||
}
|
||
|
||
// 高级选项仅在非 release 模式下显示
|
||
#if !RELEASE
|
||
GUILayout.Space(10);
|
||
|
||
// 高级选项
|
||
foldAdvancedOptions = EditorGUILayout.Foldout(foldAdvancedOptions, "高级选项", true, EditorStyles.foldoutHeader);
|
||
if (foldAdvancedOptions)
|
||
{
|
||
EditorGUILayout.BeginVertical("box");
|
||
|
||
EditorGUILayout.LabelField("开发插件 ID (devPluginId)", EditorStyles.boldLabel);
|
||
EditorGUILayout.LabelField("用于开发调试的插件 ID,发布时请使用正式插件 ID", EditorStyles.miniLabel);
|
||
config.MultiPackageMerge.devPluginId = EditorGUILayout.TextField(config.MultiPackageMerge.devPluginId);
|
||
|
||
EditorGUILayout.EndVertical();
|
||
}
|
||
#endif
|
||
|
||
GUILayout.Space(20);
|
||
|
||
// 操作按钮
|
||
EditorGUILayout.BeginHorizontal();
|
||
GUILayout.FlexibleSpace();
|
||
|
||
GUI.backgroundColor = new Color(0.2f, 0.8f, 0.2f);
|
||
if (GUILayout.Button("开始融合", GUILayout.Width(150), GUILayout.Height(40)))
|
||
{
|
||
StartMerge();
|
||
}
|
||
GUI.backgroundColor = Color.white;
|
||
|
||
GUILayout.FlexibleSpace();
|
||
EditorGUILayout.EndHorizontal();
|
||
|
||
GUILayout.Space(20);
|
||
|
||
// 说明文档
|
||
EditorGUILayout.LabelField("使用说明:", EditorStyles.boldLabel);
|
||
EditorGUILayout.LabelField(
|
||
"1. 准备ST包(单线程包)和MT包(多线程包)\n" +
|
||
"2. 分别选择两个包的路径\n" +
|
||
"3. 配置融合选项\n" +
|
||
"4. 点击\"开始融合\"按钮\n" +
|
||
"5. 融合完成后在输出目录查看结果",
|
||
EditorStyles.wordWrappedLabel);
|
||
|
||
EditorGUILayout.EndScrollView();
|
||
|
||
// 实时保存
|
||
if (GUI.changed)
|
||
{
|
||
SaveConfig();
|
||
}
|
||
}
|
||
|
||
private void StartMerge()
|
||
{
|
||
// 验证配置
|
||
if (!WXMultiPackageMergeCore.ValidateConfig(config.MultiPackageMerge, out string errorMessage))
|
||
{
|
||
EditorUtility.DisplayDialog("错误", errorMessage, "确定");
|
||
return;
|
||
}
|
||
|
||
SaveConfig();
|
||
|
||
// 调用融合逻辑
|
||
WXMultiPackageMergeCore.ExecuteMerge(
|
||
config.MultiPackageMerge,
|
||
onOutput: (log) => UnityEngine.Debug.Log(log),
|
||
onError: (error) => UnityEngine.Debug.LogError(error),
|
||
onSuccess: () =>
|
||
{
|
||
EditorUtility.DisplayDialog("成功", $"多包融合完成!\n输出目录: {config.MultiPackageMerge.outputPath}", "确定");
|
||
EditorUtility.RevealInFinder(config.MultiPackageMerge.outputPath);
|
||
},
|
||
onFailed: (error) =>
|
||
{
|
||
EditorUtility.DisplayDialog("错误", $"融合失败:\n{error}", "确定");
|
||
}
|
||
);
|
||
}
|
||
}
|
||
}
|