using System.IO;
using UnityEditor;
using UnityEngine;
///
/// 微信小游戏包体精简工具。
///
/// 背景:微信 SDK 在转换时会强制把 PlayerSettings 的 debugSymbolMode 设为 External
/// (见 WXConvertCore.Init),于是每次转换都会把
/// webgl.wasm.symbols.unityweb(约 10MB)及其 .br 副本写进 minigame 代码包的主包目录。
/// 该文件只用于代码分包的增量更新,对首包运行没有作用,但会显著撑大主包体积。
///
/// 用法:用菜单「微信小游戏 / 转换小游戏(精简包体)」代替 SDK 自带的转换菜单,
/// 转换成功后会立即删除上述符号文件。已经转换过则用「清理代码包调试符号」单独清理。
///
/// 代价:代码分包失去增量更新能力,后续发版用户需要重新下载完整 wasm。
///
public static class WeChatPackageOptimizer
{
const string ConfigPath = "Assets/WX-WASM-SDK-V2/Editor/MiniGameConfig.asset";
static readonly string[] SymbolFiles =
{
"minigame/webgl.wasm.symbols.unityweb",
"minigame/webgl.wasm.symbols.unityweb.br",
};
[MenuItem("微信小游戏 / 转换小游戏(精简包体)", false, 0)]
public static void ConvertAndSlim()
{
var result = WeChatWASM.WXConvertCore.DoExport(true);
if (result != WeChatWASM.WXConvertCore.WXExportError.SUCCEED)
{
Debug.LogError("[精简包体] 转换失败:" + result);
return;
}
CleanSymbols();
}
[MenuItem("微信小游戏 / 清理代码包调试符号", false, 20)]
public static void CleanSymbols()
{
var dst = GetDst();
if (string.IsNullOrEmpty(dst))
{
Debug.LogError("[精简包体] 未能在 " + ConfigPath + " 中读到 ProjectConf.DST");
return;
}
long freed = 0;
foreach (var rel in SymbolFiles)
{
var path = Path.Combine(dst, rel);
if (!File.Exists(path))
{
Debug.Log("[精简包体] 不存在,跳过:" + path);
continue;
}
freed += new FileInfo(path).Length;
File.Delete(path);
Debug.Log("[精简包体] 已删除 " + path);
}
Debug.Log(string.Format("[精简包体] 完成,释放 {0:F1} MB({1})。请到微信开发者工具重新上传。",
freed / 1048576.0, dst));
}
static string GetDst()
{
var asset = AssetDatabase.LoadAssetAtPath