跳到正文
Amit Shrivastava· 来源· @amitmuflis · X·· 15 小时前精选AI 评分82
推荐理由

原文给出了结合 Claude Code 与 Godot 命令行测试的具体工作流,读者可据此掌握让 AI 辅助开发游戏的实操方法。

正文 · AI 翻译

如何用 Claude 构建你的第一款电子游戏

Godot 4.7.2 于 2026 年 8 月 18 日发布。它是免费的,采用 MIT 许可证,无需安装程序,直接从下载的归档文件中运行即可。

根据 Anthropic 自己的文档,Claude Code 会读取你的代码库,编辑文件,运行命令,并在你的终端、IDE、桌面应用和浏览器中工作。

将这两者结合起来,初学者可以在一个周末内完成一款小型、可玩的 2D 游戏。

不是演示。不是角色撞墙的视频片段。而是一款包含开始界面、分数、失败机制的游戏,以及你可以发送给朋友的文件。

关键在于方法。大多数用 AI 构建的第一款游戏都会在同样的三个地方停滞不前:想法太大,代码针对错误的引擎版本,而且没有人检查游戏是否真的能运行。

本指南解决了这三个问题。它选择一个技术栈、一款微型游戏和一个反馈循环,并逐步引导构建过程。

下面所有引擎命令均于 2026 年 11 月 6 日在 Godot 4.7.2 上运行。官方文档链接位于底部。

为什么 Claude 是好的第一个合作伙伴

第一款游戏主要是粘合剂。输入处理、碰撞回调、计时器、分数标签、重启按钮。单独来看,这些都不难。但合在一起,足以让初学者停滞数周。

这种粘合剂正是编码代理擅长处理的领域。你用简单的英语描述行为。Claude 编写脚本,连接信号,并解释为什么选择该节点类型。

仅聊天只能得到代码片段。Claude Code 能得到一个工作的循环。它可以打开项目文件夹,创建文件,从命令行运行引擎,读取错误,并在交回控制权之前修复它。

Anthropic 的最佳实践页面直截了当地说明了这一点的重要性。当 Claude 报告任务完成但实际上没有完成时,通常的原因是没有让它测试结果。给它一个返回通过或失败的检查,它就可以在没有你的情况下闭环。

游戏引擎恰好有极好的检查机制。你将在几分钟内构建这个工具,它对成功的贡献比任何提示技巧都大。

技术栈:Godot 4 与 GDScript

选择一个技术栈并坚持使用。在第一个项目中途切换引擎是永远无法完成项目的可靠方式。

我用 Claude 制作第一款游戏的默认选择是 Godot 4 和 GDScript。以下是它胜过另外两个流行的初学者路线的原因。

它是一个完整的引擎。场景、2D 物理、碰撞形状、音频、UI 和导出都是内置的。你不需要在绘制精灵之前组装一个框架。

它是免费且开源的。Godot 的常见问题解答将其描述为在 MIT 许可证下的免费开源软件。没有席位费用,没有收入分成,没有账户。

GDScript 易于阅读。Godot 的常见问题解答称它是为 Godot 构建的,任何写过 Python 的人都会觉得熟悉。你可以在没有计算机科学学位的情况下理解 Claude 编写的代码。

项目文件是文本。脚本是 .gd 文件,场景是 .tscn 文件,设置保存在 project.godot 中。代理可以读取所有这些内容,你也可以在 git 中比较所有这些内容。

它可以无头运行。这是关键的一点。Godot 的命令行教程记录了一个 --headless 标志,一个解析脚本中的错误并退出的 --check-only 标志,以及一个运行指定次数迭代后退出的 --quit-after 标志。这是一个 Claude 可以在每次更改时调用的测试工具。

其他选择也不错,只是不同。Phaser 是一个用于 JavaScript 或 TypeScript 的免费开源 HTML5 框架,如果你想要一个浏览器游戏并且已经熟悉 Web 工具链,这是一个不错的选择。Pygame 让你完全控制程序循环,其自身文档警告这很容易在早期出错。使用 Pygame 时,你需要构建许多 Godot 免费提供的部分。

对于想要完成游戏而不是学习框架的初学者来说,Godot 是最短路径。

可选步骤零:在工件中原型化体验

在安装任何东西之前,你可以测试你的想法是否有趣。

Claude 的帮助中心将工件描述为 Claude 制作的、在与对话旁边打开的内容,包括单页网站和小型交互工具。只要设置中开启了代码执行和文件创建,工件在所有计划(包括免费版)上都可用。

在普通聊天中要求 Claude 为你的游戏创建一个单页 HTML canvas 版本:一个用方向键移动的正方形,要收集的圆圈,要避免的红色正方形,一个 60 秒的计时器。在侧面板中玩十分钟。

如果作为方块它很无聊,那么加上艺术效果也会很无聊。现在就改变规则,此时改变的成本只是一条消息。

然后扔掉那个原型。它只是一个草图。真正的构建发生在 Godot 中。

范围:先写一页规格说明书

在编写代码之前,你能做的最有用的事情就是让游戏比你认为应该的要小。

这是我推荐的第一款游戏的规格说明书。称之为 Coin Rush(金币冲刺)。

  1. 俯视视角,一个屏幕,无滚动。
  2. 玩家使用方向键或 WASD 向八个方向移动。
  3. 金币随机出现。触碰一个增加 10 分。
  4. 一个危险物横跨屏幕漂移。触碰它结束运行。
  5. 每次运行持续 60 秒。幸存下来,你的分数就有效。
  6. 一个开始界面,一个分数标签,一个计时器标签,以及一个带有重启按钮的游戏结束界面。
  7. 一个音乐循环和两个音效。

就是这样。没有关卡,没有商店,没有存档系统,没有 AI 敌人,没有故事。

这接近 Godot 官方第一个 2D 教程构建的游戏,称为 Dodge the Creeps(躲避蠕虫)。这是故意的。当你卡住时,官方教程是几乎所有部分的参考实现:玩家场景、输入动作、Area2D 碰撞、计时器、HUD 和声音。

将规格说明书保存为项目根目录下的 SPEC.md。Claude Code 的最佳实践页面建议对任何你没有完全想清楚的事情采用 exactly 这个模式:让 Claude 采访你直到它能写出规格说明书,保存到文件,然后启动一个新会话从中构建。

规格说明书是你完成的定义。不在其中的东西等到版本二再说。

大约三十分钟的安装

你需要四样东西。

Godot。从 http://godotengine.org 下载适合你操作系统的标准版本。下载页面说提取并运行;它是自包含的。选择标准版本,而不是 .NET 版本,因为 GDScript 是你唯一需要的,而 C# 项目目前在 Godot 4 中无法导出到 Web。

Claude Code。官方安装在 macOS、Linux 或 WSL 的终端中只需一行命令,文档中列出了 PowerShell、CMD、Homebrew 和 WinGet 选项。然后在你的项目文件夹中运行 claude。大多数界面需要 Claude 订阅或 Anthropic Console 账户。

Git。在每个可用的切片后提交。当编辑出错时,它是你的撤销按钮。

一个项目。打开 Godot,创建一个新项目,选择一个文件夹。Godot 的教程指出你只需要一个有效的项目路径;默认值即可。

使 godot 命令可以从你的终端访问,要么将二进制文件放在 PATH 上,要么在 CLAUDE.md 中告诉 Claude 完整路径。

现在编写 CLAUDE.md。Claude Code 在每个会话开始时加载此文件。Anthropic 建议保持简短,少于 200 行,只填充 Claude 无法通过读取仓库推断出的内容。你可以运行 /init 生成初始版本,然后精简它。

对于 Godot 项目,我的看起来大致如下:

引擎:Godot 4.7.2。仅限 GDScript 2.0。永远不要使用 Godot 3 语法或 Python 语法。
使用 @export, @onready, await, CharacterBody2D, instantiate(), signal.connect(callable)。
文件夹:scripts/ 存放代码,scenes/ 存放 .tscn 文件,assets/ 存放图像和音频,tests/ 存放检查脚本。
根据需要更改 .gd 文件。仅在请求时触摸 .tscn 文件,并且永远不要更改它们的 ext_resource id 或 uid 值。
提交 .uid 文件。永远不要编辑或提交 .godot/。
每次更改后运行下面的检查并读取输出。
在更改 project.godot、输入映射或自动加载之前询问。

其中两行存在是因为 Godot 的工作方式,它们节省了真正的痛苦。

.godot 文件夹是一个缓存。Godot 的版本控制页面将其列为保持在 git 之外的项目缓存数据。

.uid 文件很重要。Godot 关于 4.4 UID 更改的文章本身指出这些文件应该被提交,并且应该随其脚本移动。急于求成的代理会试图清理它们,除非被告知不要这样做。

工具:让引擎评判 Claude 的工作

本节是让游戏正常运行与充满自信声明的聊天记录之间的区别。

四个命令,全部记录在 Godot 的命令行参考中:

godot --headless --path . --import
godot --headless --path . --check-only --script res://scripts/player.gd
godot --headless --path . --script res://tests/test_scoring.gd
godot --headless --path . --quit-after 120

第一个在不打开窗口的情况下导入资源。在新鲜检出或添加资产后运行一次。

第二个解析一个脚本并退出。如果脚本损坏,你会得到一个命名行的解析错误,进程返回 1。

第三个运行测试脚本。任何扩展 SceneTree 的脚本都可以这样运行,调用你的游戏逻辑,打印 PASS 或 FAIL,并以 0 或 1 退出。

第四个启动主场景,让它滴答 120 次,然后关闭。运行时错误和你的 print() 行会显示在输出中。

一个陷阱。在 4.7.2 上的测试中,如调用空值方法的运行时错误打印了 SCRIPT ERROR,但进程仍以代码 0 退出。因此 CLAUDE.md 中的规则必须是:任何包含 SCRIPT ERROR 或 ERROR 的行都算作失败,无论退出代码如何。

让 Claude 将所有这四个包装在一个脚本中,例如 http://check.sh,以便单个命令运行所有内容并在任何错误行上失败。然后将该命令放入 CLAUDE.md。Anthropic 的最佳实践页面称运行你检查的命令是该文件中最有用的行。

如果你想强制执行检查而不是请求,Claude Code 支持 Stop hook。你的脚本在 Claude 尝试完成时触发,退出代码 2 阻止完成并将脚本的错误文本返回给 Claude。一个简单的包装器运行解析检查并 grep SCRIPT ERROR 就足够了。

对于以后的真正单元测试,GUT(Godot 单元测试框架)从命令行运行。其文档称 9.x 版针对 Godot 4,当所有测试通过时运行器返回 0,任何失败时返回 1。对于 Coin Rush,手写 SceneTree 测试就足够了。

Godot 3 陷阱

这值得拥有自己的部分,因为它几乎咬到了每个人。

Godot 4 从 Godot 3 更改了许多名称和关键字,多年来 Godot 3 的教程和论坛答案仍然在线。向任何语言模型询问 Godot 代码而不固定版本,你有时会得到旧的方言。

常见示例:KinematicBody2D 而不是 CharacterBody2D,yield 而不是 await,export var 而不是 @export var,instance() 而不是 instantiate(),以及将方法名作为字符串传递的连接调用。Godot 的官方升级指南列出了这些重命名。

你不需要记住列表。你需要引擎大声拒绝旧代码。将 Godot 3 风格的脚本喂给 4.7.2 上的解析检查,它会立即失败。对于旧的 export var 行,错误指出 export 关键字在 Godot 4 中被移除,并指向 @export 注解,附带文件和行号。

这就是为什么版本行位于 CLAUDE.md 顶部,以及为什么解析检查在每次编辑后运行。双重保险。

垂直切片构建

不要要求游戏。要求一个运行的切片,检查它,提交它,然后要求下一个。

垂直切片是游戏的一个薄片,端到端工作。你可以按下播放并看到它做某事。以下每一个都是一次会话或更少。

切片 1:一个移动的玩家

在 claude 中在项目文件夹中启动 Claude Code,并将 Godot 编辑器保持在其旁边。Claude 编辑文件;Godot 拾取更改。你按下播放。

提示:

读取 SPEC.md 和 CLAUDE.md。创建 scenes/player.tscn 作为带有 Sprite2D 和 CollisionShape2D 的 Area2D,以及 scripts/player.gd。为方向键和 WASD 添加输入动作 move_left, move_right, move_up, move_down。将玩家限制在屏幕内。运行导入和解析检查,然后运行游戏 120 帧,并向我展示输出。

Claude 应该落脚的脚本核心很短:

extends Area2D

@export var speed: float = 300.0

func _process(delta: float) -> void:
var dir := Input.get_vector("move_left", "move_right", "move_up", "move_down")
position += dir * speed * delta
position = position.clamp(http://Vector2.ZERO, get_viewport_rect().size)

这在 4.7.2 上解析干净。暂时使用纯色矩形作为精灵。

自己在编辑器中按下播放。如果移动感觉慢或滑,在检查器中更改导出的速度值,而不是在代码中。提交。

切片 2:金币和碰撞

提示:

添加 scenes/coin.tscn,一个带有小圆形形状和 collected 信号的 Area2D。当玩家重叠它时,发出 collected 并释放金币。在主场景中,在屏幕内的随机位置生成一个金币,屏幕上保持正好一个金币,每次拾取加 10 分。将计分数学放在 scripts/scoring.gd 中的静态 add_coin(score) 函数中,类名为 Scoring,并编写 tests/test_scoring.gd 来检查它。运行所有检查。

Godot 的 Area2D 文档涵盖重叠检测。官方教程也将其玩家构建为 Area2D,并使用重叠信号来检测命中。

测试可以这么小:

extends SceneTree

func _init() -> void:
var ok := Scoring.add_coin(0) == 10 and Scoring.add_coin(10) == 20
print("PASS" if ok else "FAIL")
quit(0 if ok else 1)

将计分规则拉入一个普通函数是使微小单元测试成为可能的技巧。碰撞很难在无头模式下测试。一个加分的函数测试起来很简单。将你关心的逻辑放在这样的函数中,并保持节点轻薄。

提交。

切片 3:危险物和失败方式

提示:

添加一个危险物,每 2 秒从一边生成并沿随机角度横跨屏幕漂移,离开屏幕时自行释放。触碰它在玩家上发出 hit 信号,停止生成,并显示游戏结束。使用 Timer 节点进行生成。不要添加物理体;Area2D 重叠就足够了。

最后一行很重要。第一款游戏很少需要真实的物理模拟。Area2D 重叠更容易推理且更难出错。

玩一下。如果两秒钟感觉太容易或太苛刻,在添加任何其他内容之前调整计时器。

提交。

切片 4:分数、计时器、开始、重启

提示:

添加一个带有分数标签、剩余秒数标签、消息标签和开始按钮的 HUD CanvasLayer。开始显示标题。按下开始或 Enter 开始 60 秒的运行。当时间用完或玩家被击中时,显示最终分数和再次出现的开始按钮。重启时重置分数、计时器、金币和危险物。

官方的 Dodge the Creeps 教程构建了几乎完全相同的 HUD,包括将 start_game 动作映射到 Enter 键。如果它过度构建,将 Claude 指向该页面。

现在你有了一个游戏。丑陋,但完整。提交并标记为 v0.1。

切片 5:艺术和音频

这是初学者浪费数周的地方。不要画任何东西。

使用免费资产。Kenney 的支持页面说 Kenney 资产页面上的每个资产都在 CC0 下属于公共领域,可用于商业项目,不需要署名。Godot 的教程还附带一个小资产 zip,包含玩家精灵、敌人精灵、音乐循环和游戏结束声音。

选择一个包,只将你使用的文件复制到 assets/,运行导入命令,并要求 Claude 用精灵替换彩色矩形,并为音乐、拾取和游戏结束连接 AudioStreamPlayer 节点。

来自官方教程的一个 Godot 细节:音频导入时循环禁用。在导入设置中为音乐轨道打开 Loop,否则它将在一遍后停止。

提交。

切片 6:导出一个别人可以玩的构建

Godot 需要先安装导出模板才能打包你的游戏。导出文档指向编辑器,然后管理导出模板,在那里安装你需要的平台。

为你的桌面平台创建一个导出预设,如果需要浏览器构建,再创建一个 Web 预设。Godot 4 的 Web 导出使用兼容性渲染器针对 WebGL 2.0。文档称自 Godot 4.3 以来支持的单线程 Web 导出现在是默认和首选选项。多线程构建需要特殊的服务器标头和完整的跨源隔离。单线程构建跳过这些,并且与 itch.io 等游戏主机更兼容。

一旦预设存在,导出也可以从终端工作:

godot --headless --export-release "Linux" builds/coinrush.x86_64

这里“Linux”只是你命名的预设的名称。文档说名称必须与 export_presets.cfg 中的一个匹配,如果包含空格则需要引号,并且输出文件夹必须已经存在。

教程的分享建议很简单:压缩导出的可执行文件和其 PCK 文件,而不是原始项目,然后上传。

如何提示 Claude 进行游戏工作

我学到的大部分内容可以归纳为八条规则。

1. 规格优先于代码。Claude 不能读心。一个简短的 SPEC.md 回答了它原本会猜测的大多数问题。Anthropic 的文档建议在不确定时让 Claude 采访你,然后在新会话中构建。

2. 每个提示一个切片。命名文件、节点类型和完成的样子。“添加一个硬币”是模糊的。“添加 scenes/coin.tscn 作为在重叠时发出 collected 的 Area2D,然后运行检查”是一个任务。

3. 要求证据,而不是摘要。最佳实践页面说要求 Claude 运行的命令及其输出。“所有测试通过”告诉你很少。粘贴的输出告诉你一切。

4. 在任何有风险的事情上先计划。Claude Code 的计划模式,通过 Shift+Tab 或 claude --permission-mode plan 到达,让 Claude 读取文件并提出计划,直到你批准才编辑。在重构场景之前使用它。

5. 更改,不要重写。当某些东西不对时,描述症状和文件:“玩家在 http://player.gd 中可以离开屏幕底部;仅修复钳位。”要求它重写整个脚本会丢弃正在工作的代码。

6. 两次失误后重置。文档建议在纠正同一件事两次后,运行 /clear 并编写一个更好的提示,其中包括你学到的内容。按 Esc 停止漂移的运行,并使用 /rewind 回滚编辑。

7. 说你想要更多。Anthropic 指出 Claude 倾向于构建满足请求的最小事物。如果你想要带有处理边缘情况的精致版本,说“大胆一点”并列出这意味着什么。

8. 努力与工作匹配。文档称 Claude Code 在大多数计划上默认为中等努力。当你调整数字并无论如何审查每个结果时,降低到 /effort low。对于你无法解释的 bug,如碰撞触发两次,提高到 /effort high。努力是主要控制;诸如“思考得更深入”之类的短语只会在此之内微调。

截图也有帮助。文档列出直接将图像粘贴到提示中作为向 Claude 提供它看不到的内容的方法。精灵漂浮在其碰撞框上方的截图比一段描述更有价值。

试玩循环

工具告诉你游戏正在运行。只有你能判断它是否有趣。

在每个切片之后,在要求任何新内容之前玩三次完整的运行。用一行记下感觉不对的地方。太慢,硬币太小,左侧的危险物不公平。

然后将列表交给 Claude,要求它仅更改导出的值和计时器,然后再次玩。

使用编辑器的检查器进行调整。像速度和生成间隔这样的导出变量会出现在那里,所以你可以在一分钟内尝试十个值而不接触代码。

让另一个人玩到切片 4。观看,不要解释。他们困惑的地方就是你真正的错误列表。

Claude Code 还提供 /verify 命令,它要求 Claude 自己启动应用程序并检查发生的情况。它捕捉测试遗漏的问题,但它不能替代你的手在键盘上。

常见陷阱

范围蔓延。每个想法在晚上 11 点都觉得很小。将新想法写在 IDEAS.md 中,并将它们留在那里直到标记 v0.1。

资产地狱。寻找完美的精灵包是有良好照明的拖延症。先用盒子发货,然后交换一个 CC0 包。

先物理后乐趣。RigidBody2D、反弹材料和重力调整感觉像进步。对于第一款游戏,重叠检查和简单移动就足够了。只有在设计需要时才添加物理。

一次性要求整个引擎。“为我构建一个具有程序化关卡、库存和存档文件的 Roguelike”会产生一堆没人能调试的代码,尤其是你。切片使每次故障都很小。

手动编辑场景文件。.tscn 文件是文本,但节点通过 ids 和 uids 引用资源。除非你已经提交并明确要求 Claude 进行文本编辑,否则在编辑器中进行结构场景更改。

信任退出代码 0。上面已涵盖,值得重复。读取输出以查找 SCRIPT ERROR。

混合引擎和版本。留在 Godot 4 上。在 CLAUDE.md 中固定确切版本。永远不要将 Godot 3 教程答案粘贴到项目中而不运行解析检查。

长且不专注的会话。每个请求都会重新发送对话。在不相关的切片之间运行 /clear,以便下一个任务不会拖上上一个的历史。

关于 Claude Projects 的说明

Claude 的帮助中心描述了 Projects 的新版本,处于测试阶段,首先在 Claude Code 中向选定的 Pro、Max 和 Ultra 用户推出。在该版本中,项目是一个单一的对话。Claude 将工作分解为并行运行并在你关闭笔记本电脑后继续的云线程。

这对于以后很有趣,当时艺术、音频和代码可以并行移动。对于第一款游戏,一个文件夹中的一个本地 Claude Code 会话更简单且更容易跟踪。先学习循环。

发布后

当 Coin Rush v0.1 被压缩并交到朋友手中时,你已经完成了艰难的部分。之后的一切都是迭代。

好的下一步,一次一个:

1. 润色。击中时的屏幕震动,拾取时的粒子爆发,分数标签上的短暂缓动。小而便宜,它们比任何新功能更能改变游戏的感受。

2. 具有不同移动模式的第二种危险物类型。

3. 在运行之间保存的最高分数。Godot 的存档游戏页面展示了模式,写入 user:// 路径。

4. 三个具有上升生成率的关卡,作为数据构建,而不是作为主场景的三个副本。

5. 控制器支持。官方教程展示了如何将游戏手柄按钮添加到现有输入动作。

6. 免费游戏托管页面上的 Web 构建,以便任何人都可以点击播放。

对每个保持相同的循环:在两行中指定更改,一个切片,运行检查,读取输出,玩三次,提交。

这个循环才是真正的技能。Claude 快速编写代码。引擎如实告诉你它是否运行。你的工作是范围、品味和决定接下来构建什么。

所以保持第一款游戏小巧,让引擎评判每次更改,并在这个周末将一个可玩的构建交到别人手中。第二款游戏会更简单,因为循环将成为习惯。

来源

https://godotengine.org/download/linux/
https://docs.godotengine.org/en/stable/about/faq.html
https://docs.godotengine.org/en/stable/getting_started/first_2d_game/index.html
https://docs.godotengine.org/en/stable/getting_started/first_2d_game/01.project_setup.html
https://docs.godotengine.org/en/stable/getting_started/first_2d_game/03.coding_the_player.html
https://docs.godotengine.org/en/stable/getting_started/first_2d_game/05.the_main_game_scene.html
https://docs.godotengine.org/en/stable/getting_started/first_2d_game/07.finishing-up.html
https://docs.godotengine.org/en/stable/tutorials/editor/command_line_tutorial.html
https://docs.godotengine.org/en/stable/tutorials/physics/using_area_2d.html
https://docs.godotengine.org/en/stable/tutorials/migrating/upgrading_to_godot_4.html
https://docs.godotengine.org/en/stable/tutorials/best_practices/version_control_systems.html
https://godotengine.org/article/uid-changes-coming-to-godot-4-4/
https://docs.godotengine.org/en/stable/tutorials/export/exporting_projects.html
https://docs.godotengine.org/en/stable/tutorials/export/exporting_for_web.html
https://docs.godotengine.org/en/stable/tutorials/io/saving_games.html
https://gut.readthedocs.io/en/latest/Command-Line.html
https://github.com/bitwes/Gut
https://code.claude.com/docs/en/overview
https://code.claude.com/docs/en/quickstart
https://code.claude.com/docs/en/best-practices
https://code.claude.com/docs/en/memory
https://code.claude.com/docs/en/common-workflows
https://code.claude.com/docs/en/hooks-guide
https://support.claude.com/en/articles/9487310-what-are-artifacts-and-how-do-i-use-them
https://support.claude.com/en/articles/9517075-what-are-projects
https://kenney.nl/support
https://docs.phaser.io/phaser/getting-started/what-is-phaser
https://www.pygame.org/docs/
https://starterloot.com/guides/how-to-use-claude-code-with-godot/

来源:Amit Shrivastava · x.com