Godot 引擎学习路径整理
本文整理自多篇优质博客文章,按照从入门到进阶的学习路径进行组织
目录
基础阶段
一、熟悉编辑器界面
1.1 界面布局概览
Godot 编辑器采用模块化布局,主要包含以下区域:
| 区域 | 位置 | 功能说明 |
|---|---|---|
| 菜单栏 | 顶部 | 文件、编辑、项目等主要操作 |
| 工具栏 | 上方 | 运行/暂停/停止,场景保存,2D/3D/脚本切换 |
| 场景树 | 左侧面板 | 显示当前场景的节点层级结构 |
| 文件系统 | 左侧面板 | 管理项目资源(图片、音频、脚本等) |
| 主视图区 | 中央 | 2D/3D 场景编辑器或脚本编辑器 |
| 检查器 | 右侧面板 | 编辑选中节点的属性 |
| 底部面板 | 底部 | 输出日志、调试器、动画/音频工具 |
1.2 核心面板详解
场景树(Scene Tree)
- 显示当前场景中的所有节点及其层级关系
- 支持拖拽调整节点父子关系
- 右键菜单可添加子节点、重命名、删除等操作
检查器(Inspector)
- 显示和编辑选中节点的所有属性
- 支持实时修改并预览效果
- 可展开/折叠属性分组
文件系统(FileSystem)
- 管理项目中的所有资源文件
- 支持新建、导入、删除、重命名操作
- 拖拽资源到场景树可快速创建对应节点
1.3 实用技巧
- 快捷键:
Ctrl+Shift+P切换预设布局 - 独立窗口:右键 Dock 标签可"Undock",双屏效率更高
- 快速运行:
F6运行当前场景,F5运行主场景
参考文章:
二、理解节点系统
2.1 核心概念
节点(Node)
- Godot 中最基本的构建块,就像乐高积木
- 每个节点有特定功能:Sprite2D 显示图片、AudioStreamPlayer 播放音频
- 节点可以包含子节点,形成树状结构
- 父节点的变换会影响所有子节点
场景(Scene)
- 节点的容器,用于组织节点层级
- 场景文件后缀为
.tscn - 一个场景可以嵌套另一个场景(类似 Prefab)
- 建议一个功能/界面一个场景,通过嵌套复用
2.2 常用节点类型
| 节点类型 | 用途 | 典型应用场景 |
|---|---|---|
Node2D | 2D 场景根节点 | 2D 游戏主场景 |
Sprite2D | 显示 2D 图片 | 游戏角色、背景 |
CharacterBody2D | 角色物理体 | 玩家角色、NPC |
Area2D | 区域检测 | 触发器、收集品 |
CollisionShape2D | 碰撞形状 | 与物理体配合使用 |
Label | 显示文本 | UI 文字、分数显示 |
Camera2D | 2D 摄像机 | 跟随玩家视角 |
2.3 场景树与信号
场景树(Scene Tree)
- 游戏运行时所有节点的层级结构
- 通过
get_tree()访问场景树 - 可以切换场景、暂停游戏等
信号(Signal)
- Godot 的观察者模式实现
- 用于节点间松耦合通信
- 可在编辑器中连接,也可用代码连接
# 代码连接信号示例
$Area2D.body_entered.connect(_on_body_entered)
func _on_body_entered(body):
print("物体进入区域:", body.name)
参考文章:
三、学习 GDScript
3.1 语言特点
GDScript 是 Godot 专为游戏开发设计的脚本语言:
- 语法简洁:类似 Python,缩进表示代码块
- 类型灵活:支持动态和静态类型
- 深度集成:与 Godot API 无缝衔接
- 学习曲线平缓:专为游戏场景设计
3.2 基础语法
变量与类型
# 动态类型
var health = 100
var player_name = "Hero"
# 静态类型(推荐)
var speed: float = 200.0
var is_alive: bool = true
var inventory: Array[String] = ["sword", "shield"]
函数定义
func move(direction: Vector2, delta: float) -> void:
position += direction * speed * delta
func take_damage(amount: int) -> int:
health -= amount
return health
条件与循环
# 条件判断
if health <= 0:
die()
elif health < 30:
show_warning()
else:
continue_game()
# 循环
for i in range(5):
spawn_enemy()
while is_game_running:
process_game_logic()
3.3 生命周期函数
| 函数 | 调用时机 | 用途 |
|---|---|---|
_ready() | 节点首次进入场景树 | 初始化代码 |
_process(delta) | 每帧调用 | 持续更新的逻辑 |
_physics_process(delta) | 固定频率调用 | 物理相关逻辑 |
_input(event) | 收到输入事件时 | 处理玩家输入 |
extends CharacterBody2D
@export var speed: float = 300.0
func _ready():
# 初始化
print("玩家已准备就绪")
func _physics_process(delta):
# 处理移动
var direction = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
velocity = direction * speed
move_and_slide()
3.4 学习资源推荐
- 官方文档:GDScript 基础
- 交互式学习:Learn GDScript From Zero
- 中文教程:GDScript 零基础图文入门
参考文章:
四、制作简单 2D 游戏
4.1 官方教程:Dodge the Creeps!
Godot 官方提供的第一个 2D 游戏教程,涵盖:
- 创建完整的 2D 游戏项目结构
- 玩家角色移动与动画
- 随机生成敌人
- 计分系统
- 游戏状态管理
项目结构建议:
project/
├── assets/ # 游戏资源
│ ├── sprites/ # 图片素材
│ ├── sounds/ # 音频文件
│ └── fonts/ # 字体文件
├── scenes/ # 场景文件
│ ├── player.tscn
│ ├── enemy.tscn
│ ├── hud.tscn
│ └── main.tscn
├── scripts/ # 脚本文件
│ ├── player.gd
│ ├── enemy.gd
│ └── main.gd
└── project.godot # 项目配置
4.2 核心机制实现
玩家移动
extends CharacterBody2D
@export var speed: float = 400.0
func _physics_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
move_and_slide()
碰撞检测
# 使用 Area2D 检测收集品
extends Area2D
func _on_body_entered(body):
if body.is_in_group("player"):
# 增加分数
GameState.add_score(10)
# 销毁自己
queue_free()
4.3 学习建议
- 从模仿开始:跟着官方教程一步步做
- 理解原理:不要只复制代码,理解每行代码的作用
- 动手修改:尝试修改参数,看效果变化
- 独立实现:关闭教程,凭记忆重新实现
参考文章: