零基础 Godot 游戏开发教程:用 godot-demo-projects 的 40 多个演示学会做 2D/3D 游戏
【免费下载链接】godot-demo-projectsDemonstration and Template Projects项目地址: https://gitcode.com/GitHub_Trending/go/godot-demo-projects
godot-demo-projects 是开源引擎 Godot 的官方演示项目集合,收录了 40 多个可直接运行的 2D/3D 游戏案例。本文按学习路径带你跑通第一个演示、读透 4 个最有代表性的案例,看完就能把里面的做法搬进自己的项目。
初识:这个项目能做什么
先说结论:这个仓库不是「游戏成品合集」,而是一套「功能样例库」——每个包含project.godot的子文件夹都是一个完整的独立 Godot 项目,你可以直接打开、运行、改代码。它适合三类人:刚接触 Godot 的新手(从这里建立对节点、脚本、场景的直观认识)、从 Unity/Unreal 迁移过来想快速对照 API 的开发者,以及想同时看 GDScript 和 C# 两种写法的学习者(mono/目录里有对应 C# 版本)。仓库采用 MIT 协议,案例代码可以直接借鉴到自己的项目里。
按你感兴趣的方向选起点,下面是案例方向总览:
| 方向 | 代表案例 | 能学到什么 | 上手难度 |
|---|---|---|---|
| 2D 游戏玩法 | 2d/pong、2d/dodge_the_creeps | Area2D 碰撞、信号通信、玩家移动 | 入门 |
| 2D AI 导航 | 2d/navigation、2d/navigation_astar | 导航网格、点击寻路 | 简单 |
| 2D 动画与特效 | 2d/tween、2d/particles | Tween 补间工具、粒子系统 | 简单 |
| 3D 角色控制 | 3d/kinematic_character | CharacterBody3D、相机跟随、重力 | 进阶 |
| 3D 渲染光照 | 3d/lights_and_shadows、3d/antialiasing | 灯光阴影、抗锯齿、体积雾 | 进阶 |
| 联机多人 | networking/multiplayer_pong | 高层多人 API、状态同步 | 进阶 |
| C# 开发 | mono/pong、mono/dodge_the_creeps | 同一案例的 C# 实现 | 看基础 |
🚀第一个演示怎么跑起来:先执行git clone https://gitcode.com/GitHub_Trending/go/godot-demo-projects把仓库拉到本地,然后打开 Godot 的项目管理器,点「扫描(Scan)」并选中仓库目录,所有演示会一次性出现在列表里。挑一个你最有感觉的(新手建议2d/pong),双击进入后按 F5 运行主场景即可。
一句话小结:把仓库当「按功能分类的教材」,先扫目录选方向,再单个打开演示项目跑起来。
代表案例深度拆解:从易到难先看这 4 个
下面按「最小玩法 → 2D 玩法完整闭环 → 2D AI → 3D 角色控制器」的顺序拆 4 个案例,每个都只讲最值得带走的一两块知识。
2d/pong|教你用「信号」把游戏交互串起来
为什么选它:整个项目只有 4 个脚本、1 个主场景,是理解 Godot「信号(Signal)」机制的最小样本,官方定位就是「最佳实践演示」。
核心思路:球、挡板、墙全部是Area2D节点而不是刚体,互相之间不发生物理推挤。球碰到挡板或墙壁时,对应区域发出进入信号,球的脚本监听到信号后反转方向、加分——碰撞检测和业务逻辑完全解耦,这是 Godot 里处理「碰到某物就发生某事」最推荐的写法。
关键实现:信号连接主要配置在2d/pong/pong.tscn场景文件里,代码侧你只需要关注球和挡板各自对信号做了什么,逻辑非常薄,一句话说清:Area2D 发信号 → 球脚本改方向和分数。
你可以再试试:把球的反弹角度改成「取决于球击中挡板的位置」;或者在mono/pong里对照同一玩法的 C# 写法,体会两种语言的差异。
2d/dodge_the_creeps|教你玩家移动与受击判定的完整闭环
为什么选它:这是 Godot 教程圈最经典的入门案例,一个项目里同时覆盖了键盘输入、屏幕边界约束、动画切换、碰撞受击四种基本功,学完它 2D 游戏的骨架就齐了。
核心思路:玩家是一个Area2D,每帧读取方向键输入拼出速度向量,做归一化后乘以固定速度(这样斜着走不会比横着走快),再按delta积分到位置上,最后用clamp限制在屏幕内。受击时玩家隐藏自己并发出hit信号通知主场景,碰撞形状用延迟方式禁用,避免在物理回调里直接改物理状态。
关键实现(2d/dodge_the_creeps/player.gd,节选):
func _process(delta): var velocity = Vector2.ZERO if Input.is_action_pressed(&"move_right"): velocity.x += 1 if Input.is_action_pressed(&"move_down"): velocity.y += 1 if velocity.length() > 0: velocity = velocity.normalized() * speed position += velocity * delta你可以再试试:把「碰到怪物就消失」改成带 3 条命的系统;或者给玩家加一段受击后的无敌闪烁时间。
2d/navigation|教你让 AI 点击即走:导航网格寻路
为什么选它:「点哪里走到哪里」是 2D 游戏 AI 最常见的需求,这个案例用 Godot 的导航系统几乎零手写寻路算法就实现了,是理解NavigationRegion2D的最佳入口。
核心思路:地图上有NavigationRegion2D+NavigationPolygon描述可行走区域,角色身上的NavigationAgent2D会基于网格自动算出一条路径。你只需要在鼠标点击时把目标位置交给 agent,然后每帧读取「下一个路径点」,朝它方向以固定速度移动即可——寻路算法全部由引擎完成。
关键实现(2d/navigation/character.gd,节选):
func _physics_process(_delta: float) -> void: if navigation_agent.is_navigation_finished(): return var current_agent_position: Vector2 = global_position var next_path_position: Vector2 = navigation_agent.get_next_path_position() velocity = current_agent_position.direction_to(next_path_position) * movement_speed move_and_slide()你可以再试试:加 5 个角色一起追同一个目标,观察它们如何避让;或者对比2d/navigation_astar里手动 A* 网格寻路的做法,体会两种方案的取舍。
3d/kinematic_character|教你把 2D 角色控制器平移到 3D 世界
为什么选它:CharacterBody3D是 3D 游戏里角色控制的基石,这个案例把移动、重力、跳跃、相机跟随、坠落重置全放进一个不到 70 行的脚本里,是 2D 到 3D 过渡的最短路径。
核心思路:输入方向不直接用世界坐标,而是取相机朝向的基矩阵(去掉俯仰角后)来旋转输入向量,这样「W 前进」永远是远离相机的方向,跟视角走。水平速度用lerp做加速度/减速度插值让起步和刹车更自然,垂直方向交给重力,每帧最后调move_and_slide()让引擎处理碰撞滑动。掉出地图按下重置键时,位置被直接传送,同时必须调用reset_physics_interpolation()清掉物理插值,否则相机会从旧位置平滑「飘」回新位置,看起来就像鬼畜。
关键实现(3d/kinematic_character/player/cubio.gd,节选):
var dir := Vector3() dir.x = Input.get_axis(&"move_left", &"move_right") dir.z = Input.get_axis(&"move_forward", &"move_back") var cam_basis := camera.global_transform.basis cam_basis = cam_basis.rotated(cam_basis.x, -cam_basis.get_euler().x) dir = cam_basis * dir velocity += get_gravity() * delta move_and_slide()你可以再试试:给它加上空中二段跳(限制一次);或者把移动手感参数(ACCELERATION/DECELERATION)调大调小,体会数字如何直接映射到「手感」。
一句话小结:这 4 个案例分别对应「交互机制、玩法闭环、AI 寻路、3D 控制器」,按顺序读下来,Godot 的角色开发主链路就通了。
按你的目标做选择
你决定做什么,再回头看目录,而不是反过来:
| 目标类型 | 推荐技术组合 | 参考案例目录 |
|---|---|---|
| 2D 休闲小游戏(躲避/打砖/弹球) | Area2D + 信号 + AnimatedSprite2D | 2d/pong、2d/dodge_the_creeps |
| 带关卡的平台跳跃 | CharacterBody2D + TileMap + AnimationPlayer | 2d/physics_platformer、2d/platformer |
| 2D 含 AI 寻路的玩法 | NavigationRegion2D + NavigationAgent2D | 2d/navigation、2d/navigation_astar |
| 3D 角色动作游戏 | CharacterBody3D + move_and_slide + 相机跟随脚本 | 3d/kinematic_character、3d/rigidbody_character |
| 3D 画面表现力 | Light3D / Sky / Shader / 抗锯齿设置 | 3d/lights_and_shadows、3d/antialiasing、3d/volumetric_fog |
| 联机多人 | 高层多人 API(High-level Multiplayer)或 WebSocket | networking/multiplayer_pong、networking/websocket_chat |
| 团队用 C# 开发 | 同功能 C# 案例对照学习 | mono/pong、mono/dodge_the_creeps |
三点建议:第一,目标定好后直接打开对应案例的 README,它们会写明语言和渲染器要求,比翻代码更快;第二,如果同一个玩法在2d/、3d/、mono/都有(比如 pong),优先读与你技术栈一致的那份;第三,演示项目刻意把问题简化了,做真实游戏时再按官方文档补齐存档、资源管理这些「工程化」部分。
一句话小结:先定目标再选目录,同一案例多版本对照读,能省掉大量找例子的时间。
⚠️ 新手常踩的坑
坑 1:打开演示后脚本报错、节点类型不识别。原因是引擎版本和演示不匹配——仓库的master分支对应 Godot 下一个 4.x 开发版,而各稳定分支对应相应稳定版。规避:用哪个版本的 Godot,就切到仓库对应的分支再跑。
坑 2:在项目管理器里「跑错了项目」,运行的不是你看的那个演示。原因:仓库根目录没有project.godot,每个子文件夹才是独立项目,扫描后它们各自注册。规避:始终从目标演示自己文件夹下的project.godot进入,不要试图把整个仓库当成一个项目打开。
坑 3:运行时弹出「不能修改物理属性」类错误。原因是你在物理回调(比如body_entered信号)里直接修改了CollisionShape的物理状态,Godot 只允许延迟修改。规避:像2d/dodge_the_creeps/player.gd里那样用set_deferred("disabled", true),代码里的注释也专门解释了这一点。
坑 4:角色速度随显示器刷新率变化,60Hz 和 144Hz 上手感不一样。原因是位移没按帧时间积分,或者把物理逻辑放在了与帧率强绑定的流程里。规避:位移一定乘上delta,物理相关逻辑放进_physics_process。顺带一个性能建议:纯粹用来「检测碰到没」的物体(子弹、拾取物、触发区)用Area2D就够了,别上真实刚体,物理开销可以省一大截。
坑 5:3D 角色传送/重置后,相机和模型像「飘」了一段才归位。原因是 Godot 的物理插值会平滑两帧之间的位置,而直接改position绕过了它。规避:传送后调用reset_physics_interpolation(),3d/kinematic_character/player/cubio.gd的重置逻辑里就是这样处理的。
一句话小结:版本、项目边界、延迟修改、delta 积分、插值重置——这 5 个坑解决掉,90% 的「代码明明没错却不对劲」都会消失。
最后:资源速查
建议学习顺序:2d/pong→2d/dodge_the_creeps→2d/navigation→3d/kinematic_character,一天能走完前两个,第三天碰 3D 正好。
- README.md:仓库导入方式、分支与引擎版本对应关系
- 2d/:全部 2D 演示案例(28 个方向)
- 3d/:全部 3D 演示案例(角色、渲染、物理)
- networking/:联机与多人演示
- mono/:同套演示的 C# 版本
【免费下载链接】godot-demo-projectsDemonstration and Template Projects项目地址: https://gitcode.com/GitHub_Trending/go/godot-demo-projects
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考