Godot 引擎入门:开源游戏开发
FreeGuideOnline
最新
2026-06-17
Godot 引擎入门:开源游戏开发
欢迎来到 Godot 引擎的入门教程!无论你是完全没有游戏开发经验的新手,还是希望从其他引擎转向开源的开发者,本指南都将带你快速上手 Godot 4,迈出游戏创作的第一步。
什么是 Godot?
Godot 是一款功能齐全、完全免费且开源的游戏引擎,采用宽松的 MIT 许可证。它支持 2D 和 3D 游戏开发,拥有直观的场景与节点架构、专用的 2D 渲染管线、以及易于学习的脚本语言 GDScript。Godot 的社区活跃,文档完善,且不需要任何许可费用或版税分成。
为什么选择 Godot?
- 完全免费:零成本使用,发布游戏无需付费或分享收益。
- 开源透明:引擎源码公开,可根据需要深度定制。
- 极致的 2D 支持:专用 2D 引擎,像素坐标完美,工作流流畅。
- 灵活的场景系统:将游戏元素构建为可复用的节点树。
- 轻量且高效:安装包小,启动快,对低配硬件友好。
- 跨平台发布:一次开发,可导出到 Windows、macOS、Linux、Android、iOS、Web 等多个平台。
安装与项目创建
下载 Godot
- 访问 Godot 官方网站。
- 点击下载按钮,选择适合你操作系统的版本(Windows、macOS 或 Linux)。推荐下载标准版(Standard),无需控制台版本(.NET 版)即可开始。
- 解压下载的文件,直接运行可执行文件——Godot 无需安装,即开即用。
创建你的第一个项目
- 启动 Godot,点击 “新建项目”。
- 输入项目名称(例如 “My First Game”)。
- 选择一个存储位置。
- 渲染器保持默认(Forward+),适合大多数现代设备;如果需要兼容更老的硬件或移动设备,可选择 Mobile 或 Compatibility。
- 点击 “创建文件夹并打开”,你将进入 Godot 编辑器的主界面。
理解 Godot 的核心概念
场景与节点:一切皆节点
Godot 的核心哲学是 “场景即一切”。一个游戏是由多个场景构成的,而场景则是由各种 节点 组成的树形结构。节点可以代表图像、声音、物理体、计时器、玩家角色等一切元素。
常见节点类型
- Node2D / Node3D:2D 或 3D 场景的根节点。
- Sprite2D:显示 2D 纹理(图片)。
- CollisionShape2D / CollisionShape3D:碰撞检测形状。
- Area2D:用于检测物体进入区域的事件。
- RigidBody2D:模拟物理的刚体。
- CharacterBody2D:用于由脚本控制的运动角色。
- CanvasLayer:用于 UI 层,常用于制作 HUD。
- Label:显示文本。
- Button:按钮控件。
- Timer:计时器节点。
节点通过父子关系组织,子节点继承父节点的位置、旋转和缩放变换。你可以将任何一组节点保存为一个场景(.tscn 文件),并在其他场景中实例化它,实现模块化复用。
GDScript 快速上手
GDScript 是 Godot 的内置脚本语言,语法类似 Python,专为游戏开发优化,与引擎深度集成。
编写你的第一段代码
- 在场景树中选择一个节点(例如,添加一个
Sprite2D节点)。 - 点击“添加脚本”图标(或右键 -> 附加脚本)。
- 在弹出窗口中,Language 选择 GDScript,路径保持默认。
- 脚本会自动继承你选择的节点类型,你会看到
extends Sprite2D。 - 在
func _ready():函数中添加代码,该函数会在节点初始化后调用。
示例:让精灵随帧运动
extends Sprite2D
var speed = 200
func _process(delta):
# 获取输入方向
var direction = Vector2.ZERO
if Input.is_action_pressed("ui_right"):
direction.x += 1
if Input.is_action_pressed("ui_left"):
direction.x -= 1
if Input.is_action_pressed("ui_down"):
direction.y += 1
if Input.is_action_pressed("ui_up"):
direction.y -= 1
# 移动精灵
position += direction.normalized() * speed * delta
_process(delta)每帧调用,delta代表帧间隔时间,保证运动与帧率无关。Input.is_action_pressed()检查输入动作是否被按下(需在“项目设置”的“输入映射”中预先定义)。position是节点的当前位置。
信号:连接节点之间的通信
信号是 Godot 的解耦通信方式。当某个事情发生时(如按钮被按下、碰撞检测触发),节点会发出信号,其他节点可以监听该信号来响应。
示例:连接按钮的 pressed 信号
- 创建一个
Button节点。 - 在工具栏中切换到“节点”选项卡,找到
pressed()信号。 - 双击它,选择目标节点(通常是根节点或拥有脚本的节点),输入方法名称(如
_on_button_pressed),点击“连接”。 - 脚本中会自动生成一个方法,在其中编写响应逻辑。
func _on_button_pressed():
print("按钮被按下了!")
# 这里可以切换场景、播放音效等
构建一个简单的 2D 避障小游戏
现在让我们动手将所学概念串联起来,制作一个可以左右移动玩家、躲避下落障碍物的迷你游戏。
1. 搭建玩家场景
- 新建一个 CharacterBody2D 节点作为玩家根节点,命名为
Player。 - 为其添加 CollisionShape2D 子节点,形状设为矩形 (RectangleShape2D)。
- 添加 Sprite2D 子节点,赋予一个简单的方形图片作为角色外观。
- 附加脚本到
Player,写入移动代码(可参考上面的 GDScript 示例,但使用CharacterBody2D的move_and_slide()方法)。
extends CharacterBody2D
var speed = 400
func _physics_process(delta):
var direction = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
velocity = direction * speed
move_and_slide()
2. 创建障碍物
- 新建 RigidBody2D 节点作为障碍物。
- 添加 CollisionShape2D 和 Sprite2D,形状同样设为矩形。
- 附加脚本,让障碍物从顶部坠落并在离开屏幕下方时删除自身。
extends RigidBody2D
func _ready():
# 设置随机水平位置
position.x = randi_range(50, 600)
position.y = -50
linear_velocity = Vector2(0, 200) # 向下移动
func _physics_process(delta):
if position.y > get_viewport_rect().size.y + 50:
queue_free()
3. 组装关卡场景
- 创建一个新的 Node2D 根节点作为主场景。
- 实例化玩家场景拖入主场景,或使用“实例化子场景”按钮。
- 添加一个 Timer 节点,设置其
wait_time为 1 秒,one_shot为 false,并连接其timeout信号到主场景脚本。
extends Node2D
var obstacle_scene = preload("res://obstacle.tscn")
func _on_timer_timeout():
var obstacle = obstacle_scene.instantiate()
add_child(obstacle)
- 在
_ready中启动定时器即可。
4. 碰撞检测与游戏结束
- 在
Player场景中,为 Area2D 节点(或直接使用 CharacterBody2D 的碰撞)设置碰撞层和掩码。 - 连接
body_entered信号,当玩家与障碍物接触时,可以重新加载场景或显示“游戏结束”。
导出你的游戏
当你完成开发并测试无误后,就可以将游戏导出为可执行文件。
- 点击顶部菜单 项目 -> 导出。
- 添加一个预设(如 Windows Desktop)。
- 如果需要资源优化,可以勾选
.zip或.pck选项。 - 点击“导出项目”并选择保存路径,Godot 会生成可执行文件和数据包。
下一步学习路径
- 官方文档:Godot 自带详尽的在线/离线文档(在编辑器内按 F1 即可搜索)。
- 示例项目:在项目启动器或资产库中获取官方 demo,学习各种功能实现。
- 节点深入:探索 TileMap(瓦片地图)、AnimationPlayer(动画系统)、AudioStreamPlayer(音频)等核心节点。
- 3D 之旅:一旦熟悉 2D,可以尝试 3D 场景,利用 Spatial 节点、材质和光照制作立体世界。
- Shader 编程:学习 Godot 的着色器语言,创造独特的视觉效果。
Godot 引擎的魅力在于它的简约与强大并存。现在就开始你的第一款游戏,享受创造的乐趣吧!