1. :编辑器 4.7.2,用 citizenll/godot 微信分支编译的单线程 Web 模板导出,得到 .js、.wasm、.pck(模板带 .js.symbols 更好)。只改了游戏内容时,也可以只导出 .pck。 2. :node convert/convert.
概览
1. :编辑器 4.7.2,用 citizenll/godot 微信分支编译的单线程 Web 模板导出,得到 .js、.wasm、.pck(模板带 .js.symbols 更好)。只改了游戏内容时,也可以只导出 .pck。 2. :node convert/convert.mjs check --export → convert --export --appid-from --out → verify --project /minigame。用开发者工具打开 /minigame,。 3. :scan → 选档位 → build(30–50 分钟)。编出的 artifacts/(godot.js、godot.wasm、godot.js.symbols)配上同一个 .pck, 到另一个新目录(--export /artifacts --pck ),再完整玩一遍确认没被裁坏。 4. :把最终工程作为 workProject、 /webgl/symbols.json 作为 symbols,按 split/README.md 做。官方 init 会上传 WASM,。 5. :上传体验版(先问用户)→ 安卓和 iPhone 真机采集与测试。 :小游戏后台(AppID、添加 WXGameKit 插件、分包私钥、体验成员);授权每一次上传/预览/init/dosplit/云函数部署;在开发者工具和手机上实际玩(开发者工具无法自动点击 Godot 画布);游戏自身的微信适配——GDScript 用到的 JS 接口(convert --interfaces)、网络合法域名、存档、登录、支付、分享、广告。 实测数据(打砖块): - 转换:完整引擎和 balanced 裁剪引擎各转换一次(约 30 秒),开发者工具里都进到 2D 首帧(3D 和手机未测),详见 convert/RESULT.md。 - 保留 3D 的裁剪版(balanced 档):引擎下载体积 8.70 MB → 5.95 MB(-31.6%),开发者工具里 2D 和 3D 实玩正常(手机未测),详见 examples/breakout3d/RESULT.md。 - 只保留 2D 的裁剪版:引擎 8.69 MB → 5.08 MB。 - 分包:开局只下 3.54 MB,剩余 5.59 MB 点进 3D 时才下。
README
wechat-wasm-slim:把 Godot 游戏做成微信小游戏,并让引擎变小、开局更快
能做什么
| 工具 | 做什么 | 适用于 |
|---|---|---|
| convert(转换) | 把 Godot 项目(PCK)+ 微信版引擎,一条命令转成能在微信里跑的小游戏工程(WXGameKit 通用适配),自带浏览器兼容层(网络、键盘、震动)和加载计时汇总。不需要 godot-minigame 之类的社区小游戏模板 | Godot 4.7.2 项目(见下面“转换靠什么”) |
| trim(裁剪) | 去掉游戏用不到的引擎功能,重新编译出更小的 godot.wasm;默认带启动补丁,可以跳过默认 3D 预热 |
任何微信 Godot 小游戏(模板版或通用适配版都行) |
| split(分包) | 开局只下载必须的引擎代码,其余等玩家点进玩法时再下载 | 只适用于**通用适配(WXGameKit)**工程,因为它用的是微信官方的分包服务 |
| Godot 插件 wx_split | 游戏侧接入:点击门、采集包判断、加载计时事件、自动测试开关,游戏只调 WxSplit.enter_scene 等几个函数 |
放进游戏的 addons/ 就能用(Godot 4.7.2) |
可以只用一个,也可以都用。顺序是 转换 → 裁剪 → 重新转换 → 分包:裁剪会改变引擎,分包要在最终引擎上做。
实测:Star Tap 走完整条流程(2026-10-17)
examples/startap/ 是一个新做的小游戏:标题(改名、点击登录)+ 2D 打星星 + 3D 打星星,HTTP + WebSocket 联网,带音乐音效、震动、粒子和 shader。用它从头走了一遍,详见 examples/startap/RESULT.md:
| 环节 | 结果(iPhone 16 Pro 实测,除注明外) |
|---|---|
| convert | 开发者工具和 iPhone 上登录、联网、2D、3D 全流程正常 |
| trim(balanced,保留 3D 和联网) | 引擎 WASM 8.52 → 6.12 MB |
| split(标题首包,2D+3D 点击时下载) | 开局只下 3.04 MB,点进玩法时下 3.55 MB;两种进入顺序、0 次缺函数 |
| 跳过默认 3D 预热 | 启动的 callMain 3.3 s → 1.05–1.5 s |
| 安卓 | 分包后未测 |
更早的打砖块数据:保留 3D 裁剪 8.70 → 5.95 MB;分包开局 3.54 MB,点进 3D 再下 5.59 MB(examples/breakout3d/、examples/breakout-split/)。
转换靠什么(从 Godot 新项目直接到微信小游戏)
Star Tap 就是这样从一个全新 Godot 项目直接转成微信小游戏的,没有用 godot-minigame 模板或其他社区转换方案。整个过程用到三样东西,各管一段:
| 用到的 | 做什么 | 从哪来 |
|---|---|---|
| Godot 编辑器 4.7.2 | 只用来导出游戏内容(.pck)。官方版就行(Star Tap 用的是 Steam 上的官方 4.7.2) |
官方 |
微信版 Godot 引擎(godot.js + godot.wasm) |
在微信里运行游戏。官方 Godot 的 Web 引擎不能直接在微信里跑:它用浏览器的 fetch、文件系统、输入法,微信里没有。社区的 citizenll/godot 微信分支把这些换成了 wx.request、微信文件系统、微信键盘等 |
trim 从这个分支的源码编译(同时裁剪),也可以用别人编好的 |
| 微信官方转换器 wx-transformer | 生成 WXGameKit 通用适配工程的骨架(插件加载、WASM 压缩、首包数据),这是微信官方分包服务要求的工程结构 | 微信官方下载(便携版,本机运行) |
convert 做的事:把上面两样接起来——接上启动桥,把 PCK 打进首包数据,补浏览器兼容层和计时,生成官方分包 init 要的符号表。所以:
- 能直接转:任何 Godot 4.7.2 项目,只要能用微信版引擎跑(单线程、不用 GDExtension)。
- 不能直接转:官方 Godot Web 导出(引擎不对,
check会拦下);其他 Godot 版本(见下面“其他 Godot 版本”)。
一个游戏一份配置:wxslim.json
一个游戏只填一份 wxslim.json(放在游戏的工作目录里),convert、trim、split 都用 --config wxslim.json 读自己那一段。同目录有 wxslim.private.json 时自动合并覆盖:AppID 来源、AppID、私钥路径、云环境 ID 只能写在 private 文件里(*.private.* 已在 .gitignore 里),写进公开文件会直接报错。完整示例见 examples/startap/wxslim.json。
{
"格式": "wechat-wasm-slim/game-v1",
"game": { "name": "startap", "godotProject": "./game", "pck": "./build/startap.pck",
"interfaces": "./wx/demowx-gate2d.js", "orientation": "portrait" },
"engine": { "fromTrim": true }, // 或 "artifacts": "" / "export": "" / "js"+"wasm"(+"symbols")
"trim": { "config": "./trim.config.json", "level": "balanced", "overrides": {}, "lto": "thin", "work": "D:/wasm-build/startap" },
"split": { "projectName": "Star Tap B", "mode": "onclick", "officialCli": "./node_modules/wasmsplit-v2-ci/bin/cli.js",
"cloud": { "env": null } },
"output": { "dir": "./out" }
}
wxslim.private.json(同目录,不进仓库):
{ "game": { "appidFrom": "" }, "split": { "privateKeyPath": "", "cloud": { "env": "" } } }
| 段 | 谁读 | 字段 |
|---|---|---|
game |
都读 | name、godotProject(trim scan)、pck、interfaces、orientation、locale、compat/timing(false = 不装兼容层/计时);private:appidFrom 或 appid |
engine |
convert | 引擎来源四选一:fromTrim(用 /artifacts)、artifacts、export、js+wasm(+symbols) |
trim |
trim | config(scan 生成的裁剪配置,默认 ./trim.config.json)、level(覆盖其中的“当前档位”)、overrides(合并进“手动覆盖”,同样校验)、lto、work(编译目录,放在工具包外)、jobs、maxMinutes |
split |
split | 和旧 *.kit.json 同名的字段:projectName、mode(assemble 的默认模式)、workDir、workProject、symbols、officialCli、releasePck、trainingPck、releaseInterfaces、trainingGateHost、cloud、devtoolsDir;private:privateKeyPath、cloud.env |
output |
都读 | dir(默认 ./out)、convert(默认 /convert) |
- 默认值互相推出来:split 的
workProject默认/minigame,symbols默认/webgl/symbols.json,releasePck/releaseInterfaces默认game.pck/game.interfaces(写null表示不替换),projectName默认game.name;trim profile默认写到/.gdbuild。 - 优先级:命令行参数 >
wxslim.private.json>wxslim.json> 默认值。例如convert --config wxslim.json --out换一个输出目录。 - 校验:未知的键、类型不对(枚举、布尔、整数)、引擎来源写了两种、私密字段写进公开文件,加载时就报错并列出全部问题;输入路径(PCK、接口文件、引擎、工程目录等)在命令真正要用时检查存在,报错里带键名和绝对路径。路径相对于
wxslim.json所在目录。键名以“说明”开头的是注释,随便写。 - 工具链不在这里:转换器、emsdk、python、引擎源码是机器级配置,仍在
convert/convert.toolchain(.private).json、trim/trim.toolchain(.private).json。 node wxslim.mjs config --config wxslim.json校验并打印合并后的值(私密值只显示“已设置”);node wxslim.mjs ...只是转发给对应工具。- 旧写法(兼容):不带
--config的命令行参数、trim 的--config、split 的--config都照旧可用;工具按"格式": "wechat-wasm-slim/game-v1"区分新旧配置。
一条龙顺序
- 准备引擎和 PCK:引擎用 trim 编译(或现成的微信版引擎
.js+.wasm+.js.symbols);游戏内容用编辑器导出 PCK:godot --headless --path --export-pack "Web" game.pck(项目要用 GL Compatibility 渲染)。 - 转换(convert):
check→convert --appid-from→verify。用开发者工具打开/minigame,人工把游戏完整玩一遍。 - (可选)裁剪(trim):
scan→ 看配置、选档位 →build(25–50 分钟)。编出的artifacts/配上同一个.pck重新 convert 到新目录,再完整玩一遍。 - (推荐)跳过默认 3D 预热:在游戏的
project.godot里加
需要 trim 编出的引擎(默认带启动补丁和宏)。开局不再编译用不到的 3D shader,第一次进 3D 时再编译。[startup] gles3/skip_default_3d_prewarm=true - 分包(split):游戏先装 Godot 插件
godot-addon/addons/wx_split,进玩法场景改用await WxSplit.enter_scene(...)(见 godot-addon/README.md)。然后split init(先问用户,会上传 WASM)→collect-pack→preview(先问用户)→ 在手机上采集 →split release→assemble→verify→preview→ 真机测试。详见split/README.md。用安卓或 iPhone 都能做第一轮采集;正式发布前两种手机都要测。
必须人工的步骤:小游戏后台(AppID、WXGameKit 插件、分包私钥、体验成员);授权每一次上传、预览、init、dosplit、云函数部署;在开发者工具和手机上实际玩(开发者工具无法自动点击 Godot 画布);游戏自身的微信适配——GDScript 用到的 JS 接口(convert --interfaces;分包接入用插件 wx_split,不用自己写)、网络合法域名(正式上线要已备案域名 + HTTPS/WSS)、登录、支付、分享、广告。
我是哪种工程?
- 只有 Godot 项目或 Web 导出 → 先用 convert 转成通用适配版。
- 工程里有
engine/godot.wasm.br和godot-loader.js→ 模板版:能用 trim,不能用 split。 - 工程里有
wx-game-kit/config.json,game.json里有 WXGameKit 插件 → 通用适配版:trim 和 split 都能用。
需要准备什么
转换(convert)
- Windows,Node.js 24。
- 官方 wx-transformer 1.0.35 便携版,路径写进
convert/convert.toolchain.json(下载地址见convert/README.md)。 - 微信版 Godot 引擎(citizenll/godot 微信分支、单线程):用 trim 编译,或者用现成的。
- Godot 编辑器 4.7.2(官方版即可),用来导出 PCK。
裁剪(trim)
- Git;微信版 Godot 引擎源码(citizenll/godot 微信分支,提交
df3cdd9bc)、emscripten 4.0.10、Python 3.9+ 和 SCons 4.4+。路径填进trim/trim.toolchain.json,首次编译前运行node trim/trim.mjs check。 - 每次编译约 25–50 分钟、约 1 GB 磁盘。编译目录(
--work)放在工具包外面。 - 内存紧张或 full-LTO 链接失败时用
--lto thin(Star Tap 在 32 GB 机器上 full-LTO 触发内存保护,thin 成功,约 25 分钟)。
分包(split):详见 split/SETUP.md。
- 小游戏后台:开发者/体验成员权限、WXGameKit 插件、代码分包私钥。
- 微信开发者工具、
npm install [email protected]。 - 一台手机就能开始(安卓或 iPhone 都行),用来采集;发布前两种手机都要测。
- 可选的云日志:见
cloud/README.md。
没有 AI:照着做
先在游戏目录写好 wxslim.json(和 wxslim.private.json),下面的命令都带 --config wxslim.json:
node wxslim.mjs config --config wxslim.json # 校验配置
node trim/trim.mjs check
node trim/trim.mjs scan --config wxslim.json # 写到 trim.config(默认 ./trim.config.json)
node trim/trim.mjs profile --config wxslim.json # 校验档位和手动覆盖,打印最终会去掉什么
node trim/trim.mjs build --config wxslim.json # 编译到 trim.work(25–50 分钟)
node convert/convert.mjs check --config wxslim.json
node convert/convert.mjs convert --config wxslim.json # 输出到 output.convert,已存在就换 --out
node convert/convert.mjs verify --config wxslim.json
node split/kit.mjs info --config wxslim.json # 看分包会用到的值和工程状态
node split/kit.mjs split init --config wxslim.json # 之后的分包命令同样换成 --config wxslim.json
下面是逐个写参数的旧写法(兼容,仍然可用)。
转换
node convert/convert.mjs check --export
node convert/convert.mjs convert --export --appid-from --out [--interfaces ]
node convert/convert.mjs verify --project /minigame
裁剪
node trim/trim.mjs check
node trim/trim.mjs scan --project --out my.trim.json
(打开 my.trim.json:选“当前档位”,在“手动覆盖”里决定保留哪些能力)
node trim/trim.mjs profile --config my.trim.json --out my.gdbuild # 校验配置,打印最终会去掉什么
node trim/trim.mjs build --config my.trim.json --work D:/wasm-build/build-1 [--lto thin]
node trim/trim.mjs apply --engine D:/wasm-build/build-1/artifacts --minigame --out # 模板版直接替换
通用适配版:用 artifacts/ 重新 convert(--js/--wasm/--symbols 指向 artifacts,--pck 指向游戏 PCK)。
分包:见 split/README.md 的“新游戏完整流程”。
有 AI:交给它
把整个 wechat-wasm-slim 文件夹给 AI,并告诉它:
“用 wechat-wasm-slim 把这个 Godot 游戏做成微信小游戏并缩小 WASM:Godot 项目在
,Web 导出在(或已有小游戏工程在 ``)。先判断工程类型,裁剪配置给我看过再编译;上传、预览和后台操作前先问我。”
skill/wechat-wasm-slim/SKILL.md 是给 AI 的操作说明。可以把这个目录放进 AI 的 skills 目录(Claude Code 是 ~/.claude/skills/,Codex 是 ~/.codex/skills/)。
裁剪怎么控制保留哪些能力
扫描生成的配置里,每一项都写了用途、扫描依据和风险:
- 当前档位:
conservative(只去掉明确用不到的编解码器)、balanced(推荐,再关掉没用到的物理、导航、XR、高级 GUI、整套 3D 等)、minimal(再把高级文字排版换成精简版)。 - 手动覆盖:
"disable_physics_2d": false表示保留 2D 物理;"module_mp3_enabled": true(写module_mp3也认)表示保留 MP3,false表示去掉。手动覆盖优先于档位。写错的键、非布尔值、非法档位会直接报错。
扫描会考虑引擎内部依赖(例如用了 LineEdit 就不关高级 GUI,因为它内部要创建 PopupMenu),纹理压缩只看纹理导入设置。但扫描只认写出来的类名:用字符串动态创建的类(ClassDB.instantiate("RigidBody2D"))扫描不到,要在手动覆盖里保留。
目录
wxslim.mjs:总入口(转发)和配置校验;lib/game-config.mjs:统一配置的解析和校验;tests/config-tests.mjs:配置测试(node --test tests/config-tests.mjs)。convert/:转换工具(convert.mjs、胶水和兼容层assets/、检查lib/)。trim/:裁剪工具(trim.mjs、扫描lib/scan.mjs、编译lib/build.mjs、默认引擎补丁patches/、工具链配置)。split/:分包工具(kit.mjs、README、SETUP)。godot-addon/addons/wx_split/:Godot 插件(autoloadWxSplit+ 配套 JS,convert 默认装成godot-data/wx-split.js)。tests/:工具包自身的测试:node tests/run.mjs [--godot ](所有 .mjs 的 node --check、点击门 / 采集门 / 接口文件 / 计时契约测试、插件 headless 运行)。cloud/:云日志云函数(可选)。skill/wechat-wasm-slim/:给 AI 的 skill。examples/startap/:完整流程示例(游戏源码、测试服务、接口文件、配置、实测结果),用插件 wx_split 接入。examples/breakout3d/、examples/breakout-split/:打砖块的裁剪和分包配置。doctor.mjs:换版本时的只读体检(见“其他 Godot 版本”)。docs/:已知问题与处理结论(KNOWN_ISSUES.md)、版本适配指南(UPGRADING.md)、历史踩坑(PLAYBOOK.md)。
命名变更(2026-10-17)
早期实验留下的 WX15_、training12 这些编号式名字统一改成了 WXSLIM_。旧名字仍然兼容:运行时同时挂新旧两个全局名,读云日志时新旧前缀都认,所以按旧名字写的游戏代码不用改。新游戏请用新名字。
| 用途 | 新名字 | 旧名字(仍然可用) |
|---|---|---|
| 点击门(游戏调用) | __WXSLIM_CLICK_GATE__ |
__WX15_RELEASE_CLICK_GATE__ |
| 采集包标志(游戏判断) | __WXSLIM_COLLECT_GATE__ |
__WX15_TRAINING12_GATE_DIAGNOSTIC__ |
| 计时汇总日志 | [WXSLIM_TIMING] |
[WX15_TIMING] |
| 启动阶段日志 | [WXSLIM_BOOT]、[WXSLIM_RESOURCE] |
[WX15_BOOT]、[WX15_RESOURCE] |
| 点击门状态、兜底、缺函数日志 | [WXSLIM_CLICK]、[WXSLIM_FALLBACK]、[WXSLIM_PRIMARY_MISS] |
[WX15_RELEASE_CLICK]、[WX15_FALLBACK]、[WX15_PRIMARY_MISS] |
| 计时文件 | godot-data/wxslim-timing.js、wxslim-sizes.js |
wx15-timing.js、wx15-sizes.js(组装时自动换掉) |
没改的:游戏打印的 [STARTUP_3D_FLOW] 事件(游戏侧约定);引擎补丁里的 WX_LAB_* 宏和 [WX_NATIVE_*] 日志(属于引擎,改了要重编);配置文件里的键名(例如 trainingPck、trainingGateHost)。
示例配置与隐私
包内配置已去敏,REPLACE_WITH_… 和 ./input/… 均需换成使用者自己的值;未附引擎、私钥、登录状态或原始运行日志。工具链位置在 trim/trim.toolchain.json 和 convert/convert.toolchain.json 中填写;本机实际配置请另存为 *.private.json,私钥保存在仓库之外。游戏的 AppID 来源、私钥路径、云环境 ID 只写在 wxslim.private.json(工具会拒绝把它们写在公开的 wxslim.json 里)。
云日志是可选功能:不用时把 cloud.env 设为 null。启用后会上报设备平台、系统、型号、SDK 版本和筛选后的日志;云函数使用微信身份校验,并保存 OpenID 的哈希用于归属和去重。日志脱敏规则不能识别所有自由文本,请勿在游戏日志中输出个人资料或凭据。
其他 Godot 版本
现在只在 Godot 4.7.2 + 微信分支提交 df3cdd9bc + emscripten 4.0.10 + wx-transformer 1.0.35 + wasmsplit-v2-ci 2.1.5 + WXGameKit 1.3.15 上验证过。换版本时各部分的影响:
| 部分 | 换 Godot 版本要做什么 |
|---|---|
| 引擎 | 要有对应版本的微信分支源码(或自己把微信适配移植过去);trim 的启动补丁要重新打(补丁锚点会变) |
| convert | 启动桥依赖 Emscripten 模块结构和微信分支的运行时约定;check 会检查这些约定,不满足就报错 |
| PCK | 编辑器版本必须和引擎一致 |
| split | 基本不受 Godot 版本影响(作用于官方分包运行时),但新引擎要重新 init 和采集 |
工具在锚点对不上时一定会明确报错,不会悄悄出错,所以换版本可以交给 AI 按报错逐项适配:思路和检查都在工具里,改的是补丁锚点和版本号。不承诺开箱即用。
任何一个组件要换版本时,先跑只读体检,一次列出所有对不上的锚点、所在文件和行号、建议怎么改:
node doctor.mjs --engine --runtime --run-transformer
每个组件的升级步骤、要改的 pin、验证顺序(doctor → convert/verify → 开发者工具 → 真机),以及换 Godot 版本时引擎侧要做什么,见 docs/UPGRADING.md。
做不到的
- 不替你导出 Godot 项目(在 Godot 编辑器里导出),也不做游戏自身的微信适配(网络域名、登录、支付等)。
- 引擎必须是微信版(citizenll/godot 微信分支、单线程、不带 GDExtension);官方 Godot Web 引擎不能在微信里运行。
- 模板版工程不能用 split(微信官方分包只支持通用适配)。
- 官方分包只有“首包 + 一个余包”;标题、2D、3D 各一个包需要自研(未实现,见 KNOWN_ISSUES)。
- PCK 资源整体放在首包数据里,不按场景拆。
- 采集和最终验证都要人在手机上操作。
推荐工具
换一个关键词,或者移除筛选条件。
安装
npx skillfish add schreiberchiang/wechat-wasm-slim