Godot 4.6 微信小游戏导出踩坑
把《警匪大作战》从 Godot 4.6 导出到微信小游戏,听起来只是点几下「导出」的事,实际走完一遍才发现路上一坑接一坑。这篇把这段时间踩过的几个典型问题记下来,方便自己以后回看,也希望能帮到同样在折腾 Godot 微信小游戏的朋友。
一、WASM LinkError:godot.js 缺少 _setitimer_js
导出跑起来之后,微信开发者工具控制台直接报 LinkError: WebAssembly.instantiate(): Import #X module="env" function="_setitimer_js" error: function not found。这个错误来自底层 wasm 需要定时器相关函数,而微信小游戏运行时并没有提供 _setitimer_js 这个导入。
解决思路是给微信侧的桥接层补上这个导入,或者用打了补丁的导出模板。我没去手改 wasm,而是换用了社区维护、已经处理过该导入的 minigame 导出模板,问题消失。提醒一句:不同 Godot 版本对应的模板版本要对上,否则会出现更诡异的崩溃。
二、GDExtension 在 CLI 无头模式下罢工
项目里用到了 godot-minigame 这个 GDExtension 插件来适配微信环境,但它依赖编辑器的 GUI 钩子(hooks)。一旦用命令行 --headless 做无界面导出,那些钩子根本不会触发,插件等于没生效,导出的包自然缺东西。
官方插件在 CLI 下没法自动组装,只能手动把插件需要的运行时文件、配置按文档说明塞进导出目录,再手动拼接。这一步很机械,但必须做,否则游戏跑起来会找不到扩展符号。
三、中文乱码(方块字)
界面里的中文一进微信就变成方块「□」,这是典型的字体缺位。Godot 默认主题用的是不包含中文字形的字体,Web 导出后更明显。
解决办法是引入 SimHei.ttf 这种覆盖 GB2312 的中文字体,然后在项目设置里更新 default_theme.tres,把默认字体指向它。改完重新导出,方块字立刻变正常中文。
四、.pck 改 .bin:Cannot open resource pack
运行时又报错 Cannot open resource pack engine/game.pck。原因是微信小游戏对 .pck 后缀的资源包加载路径处理有差异,直接按原文件名找不到。
把导出的 game.pck 重命名为 game.bin,并在加载代码里把路径同步改掉,就能正常读取资源包。这只是个改名的活,但没踩过真的会卡很久。
五、导出模板损坏与超大资源
中途还遇到一个坑:原本用的导出模板 minigame4.4.0.1.tpz 是损坏的,解压失败。换成有效的 minigame4.6.2.tpz 后才正常导出。所以版本对不上或损坏的模板要第一时间排查。
另外 assets/models 目录下有 593MB 的超大 FBX,导出和打包都极其缓慢,甚至撑爆限制。后来用 Blender 批量压缩(见另一篇),才把体积压下来。还有一点很重要:项目里的中文目录名、中文文件名在导出时会触发 Unicode 解析错误,全部迁成英文等价物后才干净通过。
六、收尾:清缓存与 UID
所有问题修完后,记得清理 .godot 缓存和资源的 UID,做一次干净重新导入,再导出一次。这能避免旧缓存里残留的错误配置把新问题掩盖掉。
总结一句:Godot 微信小游戏导出的坑大多集中在「Web 运行时差异」和「CLI 无头模式限制」这两类。逐个定位、对照版本、手动补桥接,基本都能走通。下一篇写怎么用 Blender 把那些吃体积的模型压瘦。