零基础快速上手 Godot 游戏开发:godot-demo-projects 官方演示案例完整指南
【免费下载链接】godot-demo-projectsDemonstration and Template Projects项目地址: https://gitcode.com/GitHub_Trending/go/godot-demo-projects
godot-demo-projects 是 Godot 官方维护的演示项目集合,40 多个可直接运行的 2D/3D 实战案例。对零基础开发者来说,不用从零搭项目:打开场景就能跑,照着改几个变量,一天就能摸到输入、物理、寻路的门道。
项目速览:clone 下来怎么跑
打开终端,一行命令拉下来:
git clone https://gitcode.com/GitHub_Trending/go/godot-demo-projects用 Godot 打开任意一个子目录里的 project.godot,点运行按钮,画面就出来了——每个子项目都是独立的小游戏,互不干扰。想玩 2D 就去 2d/ 目录挑,想做 3D 就去 3d/ 目录挑。建议按下面这条路线走:先 2D 入门,再玩物理关卡,然后进 3D,最后调画质、学寻路。
第 1 站|2D 入门:3 分钟跑通第一个 2D 案例
跑起来先看到什么:运行 2d/dodge_the_creeps/ 后,一个笑脸角色站在屏幕中央,四周的怪物不断朝你冲过来,右上角分数随存活时间上涨。
背后的一个原理:玩家本体是一个 Area2D,每帧读取按键算出速度向量,直接累加到坐标上。怪物由 Timer 定时生成,玩家的碰撞体一碰到怪物就发信号,分数和结束逻辑全靠这条信号串起来。
值得抄的一段代码(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_left"): velocity.x -= 1 if velocity.length() > 0: velocity = velocity.normalized() * speed position += velocity * delta改哪个变量效果最明显:@export var speed = 400,改成 800 你会发现自己快过怪物的刷新,改到 100 则基本只能站着挨打。
动手改一改:打开 main.gd,把_on_MobTimer_timeout里怪物的速度区间randf_range(150.0, 250.0)改成randf_range(300.0, 400.0),再运行——难度瞬间翻倍,10 分钟内就能看到分数曲线变化。
第 2 站|物理关卡:重力、摩擦与跳跃手感从哪来
跑起来先看到什么:进入 2d/physics_platformer/ 后,一个小人在平台上跑、跳、放子弹,站在跷跷板上还能被带着走。
背后的一个原理:这个玩家不是 CharacterBody2D,而是 RigidBody2D,靠重力天然往下掉。跳跃手感不是调一个"跳跃力"就能搞定的,而是走/停加速度、跳跃初速度、空中减速这一组参数共同作用的结果。
值得抄的一段代码(player.gd,手感参数集中在这几个常量):
const WALK_ACCEL = 1000.0 const WALK_MAX_VELOCITY = 200.0 const JUMP_VELOCITY = 380.0 const STOP_JUMP_FORCE = 450.0 # 落地且按下跳跃时 if not jumping and jump: velocity.y = -JUMP_VELOCITY jumping = true改哪个变量效果最明显:JUMP_VELOCITY = 380.0。往下调到 200 变成小碎跳,调到 600 直接蹦出关卡,这是"手感"最直观的来源。
动手改一改:把WALK_ACCEL从 1000 降到 300,你会发现起步变得黏糊、落地刹不住车——这正是平台游戏里"摩擦力"手感的来源,不用额外写摩擦逻辑。
第 3 站|3D 上手:移动、相机与踩踏判定一次看全
跑起来先看到什么:打开 3d/squash_the_creeps/,角色在地台上移动,小怪物从四周一窝蜂地追你,跳起来踩中怪物,它被压扁并加分。
背后的一个原理:玩家是 CharacterBody3D,每帧写入 velocity 再调用 move_and_slide(),重力每帧累加保证始终贴着地面。相机挂在跟随节点下,跟着玩家转。踩踏不是靠"碰到就死",而是检查碰撞法线朝上,才判定为"踩在头顶"。
值得抄的一段代码(Player.gd,踩踏判定的关键几行):
for index in range(get_slide_collision_count()): var collision = get_slide_collision(index) if collision.get_collider().is_in_group(&"mob"): if Vector3.UP.dot(collision.get_normal()) > 0.1: collision.get_collider().squash() velocity.y = bounce_impulse break改哪个变量效果最明显:脚本顶部的@export var jump_impulse = 20,提到 30 可以连续踩跳串烧怪物,降到 12 则基本只能一次跳一个高度。
动手改一改:把fall_acceleration = 75改成 300,角色下落会像石头一样砸地,空中转向几乎无效——这就是"重力感"的 3D 版调节旋钮。
2D/3D 节点选型速查
| 你想实现的效果 | 该用哪个节点 | 去哪站抄代码 | 上手难度 |
|---|---|---|---|
| 平面自由移动、不用物理 | Area2D + 每帧改 position | 第 1 站 | ★☆☆ |
| 平台跳跃、贴地行走 | RigidBody2D 或 CharacterBody2D | 第 2 站 | ★★☆ |
| 3D 角色移动 + 跳跃 | CharacterBody3D + move_and_slide() | 第 3 站 | ★★☆ |
| 碰撞触发计分/死亡 | Area2D 的 body_entered 信号 | 第 1、3 站 | ★☆☆ |
第 4 站|画质调优:渲染模式和抗锯齿怎么选
跑起来先看到什么:打开 3d/antialiasing/,一个 3D 场景配上右侧控制面板和左上角实时 FPS,切不同抗锯齿模式时画面边缘的锯齿变化肉眼可见。
背后的一个原理:抗锯齿都挂在 viewport 上,一行属性就能切换,代价各不相同:MSAA 最干净但最吃性能,TAA 平滑一切却可能拖影,屏幕空间 AA(FXAA/SMAA)快但会轻微糊掉全屏。项目用 FPS 标签实时显示每种模式的真实开销。
值得抄的一段代码(anti_aliasing.gd,切换入口都在这里):
# 多采样抗锯齿:质量最高,最慢 get_viewport().msaa_3d = Viewport.MSAA_4X # 时间抗锯齿:全面平滑,可能有拖影 get_viewport().use_taa = true # 屏幕空间抗锯齿:快,但整体略糊 get_viewport().screen_space_aa = Viewport.SCREEN_SPACE_AA_SMAA改哪个变量效果最明显:右侧"Render Scale"滑块背后的get_viewport().scaling_3d_scale,拉到 50% 帧数立刻翻倍,再配合 FSR 放大,是低配机器的首选组合。
动手改一改:在 Compatibility 渲染模式下运行同一项目,对比 MSAA 选项自动消失的逻辑(脚本里is_compatibility分支),10 分钟理解"渲染方法决定可用画质选项"这件事。
渲染模式与抗锯齿速查
| 想要的画面效果 | 对应设置 | 代价 | 适合场景 |
|---|---|---|---|
| 边缘最干净 | MSAA 4X/8X | 帧数掉最多 | 高端机、演示 |
| 整体平滑无颗粒 | TAA | 运动中可能拖影 | 动态镜头 |
| 便宜够用 | FXAA / SMAA | 全屏略糊 | 中低端机 |
| 直接省一半算力 | Render Scale 50% + FSR | 分辨率减半 | 低配兜底 |
第 5 站|导航寻路:目标点怎么算、路线怎么画
跑起来先看到什么:运行 2d/navigation_astar/,一张太空风格的网格地图,左键点击任意空地,角色就沿着白色轨迹绕开障碍走过去,右键可以直接传送。
背后的一个原理:地图用 AStarGrid2D 表示,把每个已铺瓦片的格子标成实心(不可走),寻路时算出整条路径点列表。角色并不"理解"地图,它只是一帧一帧走向路径上的下一个点,到了就取下一个,走完回 IDLE 状态。
值得抄的一段代码(pathfind_astar.gd,建图与取路核心):
var _astar := AStarGrid2D.new() _astar.region = Rect2i(0, 0, 18, 10) for pos in get_used_cells(): _astar.set_point_solid(pos) _astar.update() _path = _astar.get_point_path(start, end)改哪个变量效果最明显:character.gd 里的speed: float = 200.0,降到 50 角色慢吞吞地挪,升到 500 则像瞬移一样贴着路线飞。
动手改一改:把 character.gd 里的ARRIVE_DISTANCE: float = 10.0改成 60,角色会在离终点很远时就判定"到达"提前停住——这个参数就是寻路角色"刹不住车"的常见元凶。
学完这一圈你能做什么
跑完 5 站,你手上已经有了四样东西:一套"输入 → 移动 → 碰撞 → 计分"的完整 2D 循环、一组调平台手感的常量表、一个 3D 角色移动 + 踩踏判定的模板,以及一套抗锯齿和寻路的现成代码。这些拼起来,一个可玩的原型就出来了。
下一步路线:
- 2D 方向:把 dodge_the_creeps 加血条和道具,读完 2d/ 里的 platformer 和 role_playing_game 补全战斗逻辑。
- 3D 方向:照着 squash_the_creeps 给怪物加状态机,参考 3d/ 里的 voxel 和 platformer 做完整关卡。
- 性能方向:在 antialiasing 项目里把 Render Scale、FSR、V-Sync 三档组合跑一遍,记下每种组合的 FPS 差异。
相关资源:
- 官方文档与项目说明:README.md
- 全部 2D 案例:2d/
- 全部 3D 案例:3d/
- C# 版本示例:mono/
【免费下载链接】godot-demo-projectsDemonstration and Template Projects项目地址: https://gitcode.com/GitHub_Trending/go/godot-demo-projects
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考