Skip to content

Godot 4 微信小游戏实战

预计阅读 35 分钟
版本信息
最后更新:2026-07-09 · Godot 4.7 · 适用基础库:≥ 3.9.0(最低兼容 ≥ 2.30.0) · 微信开发者工具:稳定版 1.06+

Godot 4 是近年来增长最快的开源游戏引擎之一,以轻量、开源、节点系统和 GDScript 著称。本章讲解如何将 Godot 4 项目导出并适配到微信小游戏环境,并以一款极简的 2D 平台跳跃游戏 为例,覆盖环境准备、核心玩法实现、微信 API 集成和发布流程。


1. Godot 4 适合微信小游戏吗?

1.1 Godot 4 微信小游戏适配现状

能力浏览器 Web 导出微信小游戏适配
渲染(WebGL)✅ 原生支持✅ 需确认适配
文件系统user://⚠️ 需映射到 wx.getFileSystemManager
网络请求✅ HTTPClient⚠️ 需桥接到 wx.request
本地存储ConfigFile / 自定义⚠️ 需桥接到 wx.setStorageSync
音频✅ WebAudio⚠️ 需适配微信音频 API
触摸输入✅ 原生✅ 通常可直接映射

2. 环境准备

2.1 安装 Godot 4

  1. 下载 Godot 4.7(推荐 .NET 版本如果你计划用 C#)。
  2. 安装并启动 Godot Editor。
  3. Editor → Export → Add… 中添加 Web 导出预设。

2.2 微信小游戏适配插件

目前 Godot 官方没有第一方微信小游戏导出插件,但社区已有基于 Web 导出的适配方案。常见思路:

  1. Godot Web 导出 + 微信适配脚本:先导出标准 Web 版本,再用脚本替换其中的浏览器 API 调用为 wx API。
  2. 社区插件:搜索 godot-minigamegodot-wechat 相关仓库,选择最近维护、有示例的项目。

本章以“Web 导出 + 适配脚本”为主路线演示。

2.3 项目目录结构

godot-platformer-wechat/
├── godot-project/              # Godot 项目目录
│   ├── project.godot
│   ├── scenes/
│   │   ├── main.tscn
│   │   ├── player.tscn
│   │   └── level_01.tscn
│   ├── scripts/
│   │   ├── player.gd
│   │   ├── enemy.gd
│   │   └── game_manager.gd
│   ├── assets/
│   │   ├── sprites/
│   │   ├── audio/
│   │   └── tilesets/
│   └── export_presets.cfg
├── wechat-adapter/             # 微信适配脚本
│   ├── wx-bridge.js            # JS 桥接层
│   └── polyfills.js            # DOM/Browser polyfills
├── build-web/                  # Godot Web 导出产物
├── dist/                       # 最终小游戏包
├── game.json
└── project.config.json

3. 核心玩法:平台跳跃

3.1 场景搭建

  1. 在 Godot 中创建 2D 场景 main.tscn
  2. 添加 CharacterBody2D 节点作为玩家,子节点包含:
    • Sprite2D:玩家外观
    • CollisionShape2D:碰撞体
    • Camera2D:跟随相机
  3. 使用 TileMapStaticBody2D 搭建地面和平台。
  4. 添加敌人 Area2DCharacterBody2D

3.2 玩家脚本

gdscript
# scripts/player.gd
extends CharacterBody2D

@export var speed: float = 200.0
@export var jump_velocity: float = -350.0
@export var gravity: float = 980.0

@onready var sprite: Sprite2D = $Sprite2D

func _physics_process(delta: float) -> void:
    # 重力
    if not is_on_floor():
        velocity.y += gravity * delta

    # 跳跃
    if Input.is_action_just_pressed("ui_up") and is_on_floor():
        velocity.y = jump_velocity

    # 左右移动
    var direction := Input.get_axis("ui_left", "ui_right")
    velocity.x = direction * speed

    move_and_slide()

    # 朝向
    if direction != 0:
        sprite.flip_h = direction < 0

3.3 敌人与碰撞

gdscript
# scripts/enemy.gd
extends CharacterBody2D

@export var patrol_speed: float = 80.0
var moving_right: bool = true

func _physics_process(delta: float) -> void:
    velocity.x = patrol_speed if moving_right else -patrol_speed
    velocity.y += 980.0 * delta
    move_and_slide()

    if is_on_wall():
        moving_right = not moving_right

3.4 游戏管理器

gdscript
# scripts/game_manager.gd
extends Node

var score: int = 0
@onready var score_label: Label = $CanvasLayer/ScoreLabel

func add_score(value: int) -> void:
    score += value
    score_label.text = "Score: %d" % score

func game_over() -> void:
    # 上传分数到微信
    WxBridge.upload_score(score)
    get_tree().reload_current_scene()

4. 微信 API 桥接

Godot 4 可以通过 JavaScriptBridge(Web 导出)与外部 JavaScript 通信。

4.1 Godot 端桥接脚本

gdscript
# scripts/wx_bridge.gd
extends Node

static func upload_score(score: int) -> void:
    if OS.has_feature("web"):
        JavaScriptBridge.eval("window.wxBridge.uploadScore(%d)" % score)

static func share_game() -> void:
    if OS.has_feature("web"):
        JavaScriptBridge.eval("window.wxBridge.shareGame()")

static func show_ad() -> void:
    if OS.has_feature("web"):
        JavaScriptBridge.eval("window.wxBridge.showRewardedAd()")

4.2 网页端桥接实现

在 Godot Web 导出的 index.html 或单独加载的 wx-bridge.js 中:

javascript
// wechat-adapter/wx-bridge.js
window.wxBridge = {
  uploadScore(score) {
    wx.setUserCloudStorage({
      KVDataList: [{ key: 'platformerScore', value: String(score) }],
      success: () => console.log('分数上传成功'),
      fail: (err) => console.error('分数上传失败', err),
    })
  },

  shareGame() {
    wx.shareAppMessage({
      title: '我在 Godot 平台跳跃游戏中闯关成功,来挑战吧!',
      imageUrl: 'https://your-cdn.com/share.png',
    })
  },

  showRewardedAd() {
    const videoAd = wx.createRewardedVideoAd({ adUnitId: 'adunit-xxx' })
    videoAd.show().catch(() => {
      videoAd.load().then(() => videoAd.show())
    })
  },

  // 将系统信息传给 Godot
  getSystemInfo() {
    return wx.getSystemInfoSync()
  },
}

4.3 在 Godot 中调用登录

gdscript
# 获取微信登录 code
func wx_login() -> void:
    if not OS.has_feature("web"):
        return

    var result = JavaScriptBridge.eval("window.wxBridge.login()")
    print("登录结果: ", result)

对应 JS 桥接:

javascript
window.wxBridge.login = () => {
  return new Promise((resolve) => {
    wx.login({
      success: (res) => resolve(res.code),
      fail: () => resolve(''),
    })
  })
}

5. Web 导出与小游戏适配

5.1 Godot Web 导出配置

  1. 打开 Project → Export
  2. 添加 Web 预设。
  3. 配置:
    • Export Format:Export Project(不是 Debug)
    • Threads:视微信基础库支持情况关闭(建议先关闭)
    • Canvas Resize Policy:Project(由 Godot 控制画布尺寸)
  4. 导出到 build-web/ 目录。

5.2 微信环境 Polyfill

Godot Web 导出会生成 index.html.js.wasm.pck 等文件。进入微信小游戏前,需要注入以下 polyfill:

javascript
// wechat-adapter/polyfills.js
if (typeof window === 'undefined') {
  globalThis.window = globalThis
}

// 注入 document
globalThis.document = globalThis.document || {
  createElement(tag) {
    if (tag === 'canvas') return wx.createCanvas()
    return {}
  },
  body: {},
  documentElement: {},
}

// 注入 localStorage
globalThis.localStorage = {
  getItem(key) {
    try {
      return wx.getStorageSync(key)
    } catch {
      return null
    }
  },
  setItem(key, value) {
    try {
      wx.setStorageSync(key, value)
    } catch (err) {
      console.error('storage set failed', err)
    }
  },
  removeItem(key) {
    wx.removeStorageSync(key)
  },
}

// 注入 fetch
globalThis.fetch = (url, options = {}) => {
  return new Promise((resolve, reject) => {
    wx.request({
      url,
      method: (options.method || 'GET').toUpperCase(),
      data: options.body,
      responseType: 'arraybuffer',
      success: (res) =>
        resolve({
          ok: res.statusCode >= 200 && res.statusCode < 300,
          status: res.statusCode,
          arrayBuffer: () => Promise.resolve(res.data),
          text: () =>
            Promise.resolve(
              typeof res.data === 'string' ? res.data : new TextDecoder().decode(res.data)
            ),
        }),
      fail: reject,
    })
  })
}

5.3 构建小游戏包

bash
# 1. Godot 导出 Web 版本
godot --headless --path godot-project --export-release "Web" ../build-web/index.html

# 2. 复制适配脚本
cp wechat-adapter/*.js build-web/

# 3. 复制小游戏配置
cp game.json build-web/
cp project.config.json build-web/

# 4. 最终目录作为 dist
mv build-web dist

5.4 小游戏配置

json
{
  "deviceOrientation": "portrait",
  "showStatusBar": false,
  "networkTimeout": {
    "request": 10000,
    "downloadFile": 10000
  },
  "subpackages": []
}

6. 分包与性能

6.1 Godot 4 Web 导出的体积

Godot 4 Web 导出的典型体积:

文件大小
.wasm15-25MB(未压缩)/ 3-5MB(gzip)
.pck取决于资源,通常 2-10MB
.js200KB-1MB

这意味着 Godot 4 原生 Web 导出很难直接满足微信小游戏首包 4MB 限制。 必须采取以下措施:

  1. 使用分包:将 .wasm.pck 放入分包,主包只保留启动逻辑。
  2. 裁剪引擎:导出时禁用不需要的模块(3D、高级音频、网络多人等)。
  3. 压缩资源:纹理用 WebP/PNGQuant,音频用 MP3/OGG。
  4. 使用 Godot 3 替代:如果项目规模小,Godot 3 的 Web 导出体积通常比 Godot 4 小很多。

6.2 分包加载 .wasm 和 .pck

json
{
  "subpackages": [
    {
      "name": "godot-engine",
      "root": "subpackages/godot-engine/"
    },
    {
      "name": "game-assets",
      "root": "subpackages/game-assets/"
    }
  ]
}
javascript
// 启动画面显示后加载分包
async function loadSubpackages() {
  await new Promise((resolve, reject) => {
    wx.loadSubpackage({
      name: 'godot-engine',
      success: resolve,
      fail: reject,
    })
  })

  await new Promise((resolve, reject) => {
    wx.loadSubpackage({
      name: 'game-assets',
      success: resolve,
      fail: reject,
    })
  })

  // 加载完成后启动 Godot
  startGodot()
}

6.3 性能建议

优化项说明
关闭 3D2D 平台跳跃不需要 3D 渲染器
减少物理节点使用 TileMap 而非大量 StaticBody2D
控制粒子数量移动端 GPU 粒子开销大
使用对象池敌人、子弹复用
降低渲染分辨率低端机降低 viewport 缩放
真机测试开发者工具无法代表真机性能

7. 与 Cocos / Phaser 的对比

维度Godot 4Cocos CreatorPhaser 4
学习曲线中(节点系统 + GDScript)中(编辑器 + TS)低(纯代码)
微信小游戏适配需社区适配 / 自行裁剪官方成熟需社区适配 / 自行裁剪
Web 导出体积大(.wasm 3-5MB+)小(主包可控)中(核心库 ~800KB)
2D 能力
3D 能力
开源协议MITMITMIT
最适合跨平台 2D/3D 独立游戏微信小游戏 2D/3DWeb 优先 + 小游戏复用

本章小结

通过本章,你了解了:

  1. Godot 4 进入微信小游戏的适配思路和主要难点
  2. 如何用 Godot 4 搭建一个 2D 平台跳跃游戏核心玩法
  3. 通过 JavaScriptBridge 实现 Godot 与微信 API 的交互
  4. Web 导出后的分包策略和性能优化方向
Godot 4 实战建议
  • ** Godot 4 不是微信小游戏的首选引擎**,如果你的目标平台只有微信小游戏,优先考虑 Cocos Creator 或 LayaAir。
  • 如果你已有 Godot 4 项目需要移植到微信,先用 Web 导出验证可行性,重点关注 .wasm 体积和启动时间。
  • 积极关注社区适配项目,Godot 生态更新快,可能出现更成熟的官方或半官方小游戏导出方案。
  • 对于超休闲小游戏,Godot 3 的 Web 导出体积更小,可能是比 Godot 4 更务实的选择。

Godot 4.7 新特性与微信小游戏迁移注意

Godot 4.7(2026-06-18 发布,"Director's Cut")在渲染、工具和生态上有明显改进,但小游戏适配仍需关注以下点:

特性Godot 4.7 变化小游戏影响
HDR 渲染管线新增高动态范围 2D/3D 支持微信小游戏 WebGL 环境下需验证兼容性,低端机建议关闭 HDR
AreaLight3D3D 区域光新实现小游戏 3D 场景慎用,性能开销大
新 Asset Store内置资源商店改版便于获取插件,但需确认资源授权与包体预算
Control 节点变换UI 系统优化对微信小游戏 UI 实现更友好,但仍需桥接输入事件

迁移建议

  1. 从 Godot 4.5/4.6 升级到 4.7 时,先备份项目并重新导出 Web 版本验证。
  2. 小游戏项目建议关闭 Viewport 的 HDR 和复杂后处理,优先保证启动速度。
  3. 如果使用 C#(Mono)版本,注意微信小游戏环境对 WASM 大小的限制,必要时改用 GDScript。
  4. 持续关注社区 godot-minigame / godot-wechat 插件,优先使用维护活跃的项目。

📝 课后练习

练习 1:平台跳跃完善

题目: 在示例平台跳跃基础上,增加以下功能:

  1. 双击方向键实现冲刺
  2. 落地时检测是否踩在敌人头顶(踩死敌人,自己弹起)
  3. 掉落出屏幕底部时游戏结束

参考答案要点:

  • 用计时器检测两次方向键输入间隔实现冲刺
  • move_and_slide() 的返回值判断碰撞方向,判断是否为从上方踩到敌人
  • _physics_process 中检测 global_position.y > 屏幕高度 + 100
练习 2:Godot 与微信桥接设计

题目: 设计一个 Godot ↔ 微信的桥接机制,让 Godot 能够调用 wx.request 并拿到返回结果。

参考答案思路:

  • Godot 端:通过 JavaScriptBridge.eval 调用一个返回 Promise 的 JS 函数
  • JS 端:window.wxBridge.request(url, method, data) 返回 Promise
  • Godot 端:由于 JavaScriptBridge.eval 是同步的,可以让 JS 端把结果写入 window.godotCallbacks[id],Godot 在下一帧轮询读取

📚 相关阅读

用心学习,持续实践