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(ConfigPath); if (asset == null) return null; var so = new SerializedObject(asset); var dst = so.FindProperty("ProjectConf.DST"); if (dst != null && !string.IsNullOrEmpty(dst.stringValue)) return dst.stringValue; var relative = so.FindProperty("ProjectConf.relativeDST"); return relative != null && !string.IsNullOrEmpty(relative.stringValue) ? relative.stringValue : null; } }