Files
daluandou/Assets/Editor/WeChatPackageOptimizer.cs
huadexuan f77fa20f82 ```
feat: 移除自适应性能相关配置并调整动画控制器

移除了Unity自适应性能(Adaptive Performance)的相关配置文件,
包括Adaptive Performance文件夹及其子目录中的所有配置文件,
同时移除了移动通知(NotificationSettings)相关配置,
以及第一章第一关(level_chapter1_level1)的关卡配置文件,
还删除了多个材质文件如AdjustableGlowOrb、AdjustableGlowOrbHalo
和Arena相关材质。另外微调了base-人类士兵.controller中状态机
的位置坐标,将x坐标从320调整为330。
```
2026-09-27 20:39:00 +08:00

81 lines
2.9 KiB
C#

using System.IO;
using UnityEditor;
using UnityEngine;
/// <summary>
/// 微信小游戏包体精简工具。
///
/// 背景:微信 SDK 在转换时会强制把 PlayerSettings 的 debugSymbolMode 设为 External
/// (见 WXConvertCore.Init),于是每次转换都会把
/// webgl.wasm.symbols.unityweb(约 10MB)及其 .br 副本写进 minigame 代码包的主包目录。
/// 该文件只用于代码分包的增量更新,对首包运行没有作用,但会显著撑大主包体积。
///
/// 用法:用菜单「微信小游戏 / 转换小游戏(精简包体)」代替 SDK 自带的转换菜单,
/// 转换成功后会立即删除上述符号文件。已经转换过则用「清理代码包调试符号」单独清理。
///
/// 代价:代码分包失去增量更新能力,后续发版用户需要重新下载完整 wasm。
/// </summary>
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<Object>(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;
}
}