MIT 免费 · 无收益分成 · 下载约 80MB 解压即用 · 2025 年 Steam 上有 1229 款游戏用它发布 · 官方中文文档带第一个游戏教程

没接触过游戏引擎、也没写过代码的人,能不能靠自己做出一个能玩的小游戏?这次实测结论是:能。从官网下载 GODOT 引擎,一个约 80MB 的压缩包,解压即用。全程分工很明确——AI 负责讲概念、写代码、读报错,我负责在编辑器里点点点。最后真的做出了「Dodge the Creeps(躲避小怪)」:一个用方向键移动的角色、从屏幕边缘随机刷出的敌人、碰到就结束、能计分、能重开。
这篇不是引擎说明书,是一份提问节奏:每一步问 AI 什么、AI 哪里干得好、哪里必须人上手。照着做,能做出同款 demo;不照着做,也能把这套问法带走,换成你想做的任何小游戏。
GODOT 是一款免费开源的游戏引擎,MIT 协议——用它做游戏不花钱,做出来卖钱也不抽成,没有订阅费。2D 和 3D 都能做,做完可以导出到 Windows、macOS、Linux、Android、iOS 和网页。它内置的脚本语言 GDScript 语法接近 Python,恰好是 AI 最容易写对的一类代码——这也是这次选它实测的一个重要原因。
它也不是小众自嗨。按 GODOT 基金会官方博客公布的数据,2025 年有 1229 款用 GODOT 制作的游戏上架 Steam,六年来游戏数量增长了 22 倍。最有名的案例是《杀戮尖塔2》:这款游戏原本在 Unity 上开发,两年多之后因为 Unity 宣布争议收费政策,开发团队整体迁到了 GODOT,GODOT 官网的作品展示页把它放在显眼位置。这个案例至少说明一件事:GODOT 扛得住商业级产品。
它特别适合独立开发者、小团队、初学者,以及想把引擎底层原理搞明白的程序员。除了《杀戮尖塔2》,《Brotato》《Cassette Beasts》这些口碑独立游戏也出自 GODOT,都能在官方作品展示页查到。作品越来越多,生态和社区涨得很快——GODOT 已经是独立开发者拿来和 Unity、Unreal 放在一起考虑的选择。
关心什么 | GODOT 的答案 | 补一句 |
费用 | 免费,MIT 协议,无收益分成 | 不是免费档,是引擎本身免费 |
语言 | 内置 GDScript,也支持 C# | GDScript 接近 Python,AI 好生成 |
平台 | 桌面、手机、网页都能导出 | 主机平台需有资质的伙伴协助 |
机器要求 | 下载包约 80MB,解压即用,核显也能跑 | 最低 OpenGL 3.3,推荐 Vulkan 1.0 |
到官网 godotengine.org 点 Download,选对应系统的普通版本(不是 .NET 版,那个是给 C# 用的)。稳定版会持续更新(写稿时是 4.7.1),下载页显示哪个稳定版就用哪个,本篇步骤在 4.x 内通用。以 Windows 为例:下载下来是一个约 80MB 的 zip,解压后里面就是一个 exe,双击即开,没有安装流程,也不用注册账号。习惯用 Steam 的话,Steam 上也有官方上架,效果一样。
第一次打开是项目管理器,界面默认英文。先把中文调出来:点右上角的 Settings 进编辑器设置,在 Interface 下找到 Editor Language,选简体中文,界面就变成中文了(个别版本没即时生效的话,关掉重开一次)。然后点「新建项目」,给项目起个名字(比如 dodge-the-creeps),选一个空文件夹当项目路径,渲染器保持默认,创建进入编辑器。
开工前把窗口尺寸改掉:项目 → 项目设置 → 显示 → 窗口,把视口宽度设成 480、高度设成 720——这个游戏是竖屏的;再往下翻,把拉伸的模式设为 canvas_items。这一步不改,游戏窗口会按默认横屏尺寸跑,后面代码里按屏幕边界算的位置全会偏。
动手前先解决一个最关键的问题:别让 AI 自由发挥。网上 GODOT 的旧教程很多,3.x 和 4.x 两个大版本的语法互不兼容;如果开口就是「帮我做个游戏」,AI 很可能把训练数据里的旧语法混着写出来。我的做法是先把图纸定下来:照着 GODOT 官方中文文档的入门教程「你的第一个 2D 游戏」做,这个教程还有个名字,Dodge the Creeps。
选它当图纸有三个好处:代码是官方写的,可以逐字对照验证;美术和声音素材官方提供,下载就能用;中文文档齐全,AI 讲不清楚的地方,可以直接翻原文查。
我要跟着 GODOT 官方文档「你的第一个 2D 游戏」(Dodge the Creeps)做第一个游戏。
我是零基础,没写过代码。
分工:你负责给我讲每一步 + 写 GDScript 代码,我负责在 GODOT 编辑器里操作。
三个硬要求:
1. 版本锁定 GODOT 4.x,不要给我 3.x 语法。
2. 语言用 GDScript,不要 C#。
3. 一步一步来,每一步做完我会告诉你,别一次全倒出来。
先从第一步开始:建什么项目,要改哪些设置。
这轮提问的要点有三个:版本说清楚、语言说清楚、一步一步来。AI 给出路线后,拿官方文档的目录对一遍:项目设置、玩家场景、玩家代码、敌人、主场景、界面、收尾,一共 7 步,路线对得上再继续。

AI 教的第一个概念是节点系统,思路很简单:GODOT 里的一切都由节点拼出来,一组节点的组合叫场景。角色是一个场景,一只敌人是一个场景,界面也是一个场景,最后由主场景把这些小场景像零件一样装起来。这个设计对新手友好:每个零件都能单独测试,跑通了再组装,不用一上来就面对一大坨。
场景 | 干什么 | 根节点用什么 |
Player | 你控制的角色 | Area2D(负责检测被撞) |
Mob | 随机刷出的敌人 | RigidBody2D(带物理,自己会动) |
HUD | 分数、提示、开始按钮 | CanvasLayer(界面层) |
Main | 把一切装起来的游戏逻辑 | 普通 Node |
先搭 Player 场景:根节点选 Area2D——它能检测到有东西碰到自己;下面加一个 AnimatedSprite2D 子节点负责播角色动画,再加一个 CollisionShape2D 定义碰撞范围。素材就用前面下载的官方教程素材包:解压后把 art 文件夹拖进项目的文件面板,再把角色的两张图拖进动画面板。这些都是点鼠标的操作,AI 替不了你,但你可以问它,它会告诉你每个按钮在哪。
写代码前还有一件事:配输入映射。项目设置 → 输入映射,逐个添加 move_left、move_right、move_up、move_down 四个动作,分别绑到键盘的四个方向键。这一步跳过,代码写得再对,按键也没反应——这是新手最容易栽的坑,不问 AI 它也不会主动提醒。
extends Area2D@export var speed = 400var screen_sizefunc _ready():····screen_size = get_viewport_rect().sizefunc _process(delta):····var velocity = Vector2.ZERO····if Input.is_action_pressed("move_right"): velocity.x += 1····if Input.is_action_pressed("move_left"): velocity.x -= 1····if Input.is_action_pressed("move_down"): velocity.y += 1····if Input.is_action_pressed("move_up"): velocity.y -= 1····if velocity.length() > 0:········velocity = velocity.normalized() * speed········$AnimatedSprite2D.play()····else:········$AnimatedSprite2D.stop()····position += velocity * delta····position = position.clamp(Vector2.ZERO, screen_size)
这段代码的逻辑很直白:每一帧检查有没有按方向键,算出移动方向,先把方向归一化(防止斜着走比直着走快),再把角色位置夹在屏幕以内。speed 前面加 @export,意思是这个速度值可以直接在编辑器右侧面板里改,不用碰代码。按方向切换动画的写法(walk、up 两组加翻转)AI 会给完整版,思路一样。代码里的 ···· 表示一级缩进,粘进编辑器时替换成 4 个空格——GDScript 靠缩进分层,缩进乱了直接报错。写完按 F6 运行当前场景,角色能朝四个方向移动,就算过了。
我在这里卡过一次:运行后控制台报 Attempt to call function 'play' in base 'null instance'。把报错原样贴给 AI,查到是代码里把节点名写成了 AnimatedSprite2d(结尾小写 d),节点名区分大小写,找不到节点就报这个错。这类报错基本都是两种原因:节点名拼错,或者那个节点没加进场景——把报错贴给 AI,比自己猜快得多。
Mob 敌人场景的结构跟玩家很像:根节点用 RigidBody2D(带物理,会自己动),下面同样挂 AnimatedSprite2D 和 CollisionShape2D,另加一个 VisibleOnScreenNotifier2D——敌人飞出屏幕就自动删掉自己,防止小怪越积越多。有两个设置必改:把 Gravity Scale 设为 0,不然敌人全会往屏幕底下掉;再把碰撞的 Mask 里的第 1 层取消勾选,让敌人之间不互相撞。
刷怪逻辑写在主场景里:用 Path2D 沿屏幕四角画一条闭合路径,路径下挂一个 PathFollow2D 子节点,每 0.5 秒在路径上随机取一个点,让敌人在那个点出生、朝屏幕里飞。AI 在这里专门提醒过:这条路径必须按顺时针画,不然敌人会朝屏幕外面刷——这种不说不知道的细节,就是跟教程做的价值。
func _on_mob_timer_timeout():····var mob = mob_scene.instantiate()····var mob_spawn_location = $MobPath/MobSpawnLocation····mob_spawn_location.progress_ratio = randf()····mob.position = mob_spawn_location.position····var direction = mob_spawn_location.rotation + PI / 2····direction += randf_range(-PI / 4, PI / 4)····mob.rotation = direction····var velocity = Vector2(randf_range(150.0, 250.0), 0.0)····mob.linear_velocity = velocity.rotated(direction)····add_child(mob)

这一段是报错的高发区,我的循环很简单:F5 运行 → 报错 → 把报错原样贴给 AI → 按它的建议改 → 再运行。最大的坑是版本:AI 如果写出 KinematicBody2D 这种旧语法,就是混进了 GODOT 3.x 的内容,回一句「说好了 4.x」让它重写。GDScript 对缩进层级很严格,粘贴代码时缩进乱了,就让 AI 把那个函数完整重发一遍,别自己补。
最后是 HUD 界面场景:根节点用 CanvasLayer,它保证界面永远显示在画面最上层;下面挂四个节点——ScoreLabel 显示分数,Message 显示「Get Ready」「Game Over」这类提示,StartButton 是开始按钮,再加一个 Timer 控制提示的停留时间。脚本写完,回主场景把 HUD 像 Player 一样实例化进来,再连一个信号:HUD 的 start_game 信号连到主场景的 new_game() 函数。
func game_over():····$ScoreTimer.stop()····$MobTimer.stop()····$HUD.show_game_over()····$Music.stop()····$DeathSound.play()func new_game():····get_tree().call_group("mobs", "queue_free")····score = 0····$Player.start($StartPosition.position)····$HUD.update_score(score)····$HUD.show_message("Get Ready")····$StartTimer.start()····$Music.play()
收尾加上音乐和音效:主场景下加两个 AudioStreamPlayer 节点,一个放素材包里的背景音乐(记得勾上循环),一个放死亡音效。按 F5,一个完整的游戏:点开始、出提示、角色出现、躲敌人、分数每秒涨、被撞就结束、再点开始还能再来一局——到这个程度,demo 就算做成了。有余力还可以换背景色、加回车键开始,官方教程里都有讲。
环节 | AI 干得好的 | 人不能省的 |
代码 | 写 GDScript、翻译报错、调参数 | 粘贴后检查缩进和节点名 |
编辑器操作 | 能告诉你每个按钮在哪 | 拖节点、画碰撞形状、画路径、导素材都得自己来 |
版本 | 锁定 4.x 之后基本可靠 | 看到 3.x 语法要自己打回去重写 |
素材 | 会提醒查授权 | 教程素材官方免费;自己做游戏换素材要自己核 |
说到底分工就两条:AI 管「怎么写」,人管「点哪里」。GODOT 编辑器里的操作——拖节点、画形状、连信号——AI 替不了你,但这些操作的学习成本很低,AI 可以一步一步陪你走。
轮次 | 你说什么 | 你要拿到什么 |
1 | 定好图纸:跟官方教程,版本锁 4.x,语言 GDScript | 完整路线 + 4 个场景分工 |
2 | Player 场景:选什么节点,移动代码怎么写 | 场景结构 + player.gd |
3 | 按键没反应 / 报错:把报错原样贴过去 | 定位到输入映射或节点名 |
4 | Mob 敌人:随机刷、朝里飞 | mob.gd + 路径要顺时针的提醒 |
5 | HUD + 接线:开始、计分、结束 | HUD 脚本 + 信号接线表 |
6 | 收尾:声音、背景、怎么导出给别人玩 | 音乐节点 + 导出模板说明 |
你的情况 | 更合适的做法 |
想系统掌握引擎 | 把官方渐进式教程完整做一遍,别全靠 AI 代写 |
想做商业 3D 项目 | 这篇只是 2D 入门,3D 要另学节点、光照、材质 |
只熟 C# | GODOT 支持,但建议先用 GDScript 入门再切换 |
想上主机平台 | 导出要找有资质的伙伴协助,跟做 demo 是两件事 |
最后补充一下这个 demo 的边界:Dodge the Creeps 是官方教学案例,素材官方免费提供;想基于它改出自己的游戏并发布,代码归你(MIT 协议),但美术素材要换成自己的或者授权清晰的。
1. 从官网 godotengine.org 下载,解压即用,不是第三方打包的安装器
2. 版本是 4.x 稳定版,不是测试版,也不是 3.x
3. 输入映射里加了 move_left / move_right / move_up / move_down 四个方向
4. 刷怪路径按屏幕四角顺时针画,不然敌人朝外飞
5. F5 能完整跑一局:开始 → 躲避 → 被撞 → 能重开
6. 素材来自官方教程包;要改了发布,换美术并核授权
编辑器顶部有一个 AssetLib(资产库)页签,里面收录了官方和社区上传的演示项目——搜 First Person Shooter(第一人称射击)或 2D Platformer(2D 平台跳跃),能找到可以直接下载运行的完整 demo。把它跑起来,读一遍代码注释,是从「照着做出来」到「自己会搭」最快的一条路;官方演示项目全集也挂在 GitHub 上,链接见文末。
做游戏说到底是一门手艺活。AI 能把查资料和试错的时间压短,让第一步没那么吓人,但真正的熟练只能靠一次次动手换来。这个 demo 只是起点,接下来把角色换成你自己的、把规则改成你想玩的,才算真正入门。
#GODOT · #GDScript #游戏开发 #杀戮尖塔2 #独立游戏 #DodgeTheCreeps
GODOT 官方下载页(Windows)
godotengine.org/download/windows/
GODOT 官方中文文档
docs.godotengine.org/zh-cn/stable/
官方入门教程:你的第一个 2D 游戏
docs.godotengine.org/zh-cn/stable/getting_started/first_2d_game/index.html
教程素材包下载
github.com/godotengine/godot-docs-project-starters/releases/download/latest-4.x/dodge_the_creeps_2d_assets.zip
完整 demo 源码(GDScript)
github.com/godotengine/godot-demo-projects/tree/master/2d/dodge_the_creeps
《杀戮尖塔2》GODOT 官方展示页
godotengine.org/showcase/slay-the-spire-2/
官方演示项目全集(godot-demo-projects)
github.com/godotengine/godot-demo-projects