Godot 3 GDScript 教程 / Godot 3 简介与安装
Godot 3 简介与安装
Godot 引擎简介
Godot 是一款完全免费、开源的游戏引擎,采用 MIT 许可证发布。开发者可以自由地使用、修改和分发,无需支付任何版税。
Godot 3 历史与版本
| 版本 | 发布时间 | 关键特性 |
|---|---|---|
| Godot 1.0 | 2014 年 12 月 | 首个公开版本 |
| Godot 2.0 | 2016 年 2 月 | 场景系统改进、新编辑器 UI |
| Godot 2.1 | 2016 年 7 月 | Asset Library、调试器增强 |
| Godot 3.0 | 2018 年 1 月 | PBR 渲染、GDScript 大改、物理引擎重写 |
| Godot 3.1 | 2019 年 3 月 | 类型化 GDScript、Tween 节点 |
| Godot 3.2 | 2020 年 1 月 | 稳定性提升、GDNative 改进 |
| Godot 3.5 | 2022 年 8 月 | 物理插值、NavigationServer |
| Godot 3.6 | 2024 年 6 月 | 3.x 最终维护版本 |
Godot 3 核心特点
- 轻量级:编辑器仅约 60MB,无需安装
- 场景驱动:一切皆节点(Node),场景可自由组合
- 内置脚本语言 GDScript:类 Python 语法,专为游戏设计
- 2D 与 3D 独立管线:2D 引擎原生支持,非 3D 投影
- 跨平台导出:支持 Windows、macOS、Linux、Android、iOS、Web、主机
Godot vs Unity vs Unreal 对比
| 特性 | Godot 3 | Unity | Unreal Engine |
|---|---|---|---|
| 授权方式 | MIT(完全免费) | 免费至收入门槛 | 免费至收入门槛 |
| 脚本语言 | GDScript、C# | C# | C++、Blueprints |
| 编辑器大小 | ~60MB | ~3GB+ | ~15GB+ |
| 2D 支持 | 原生独立 2D | 3D 投影 | 不擅长 2D |
| 学习曲线 | 🟢 低 | 🟡 中 | 🔴 高 |
| 社区规模 | 🟡 中等 | 🟢 大 | 🟢 大 |
| 主机支持 | 需第三方 | 原生 | 原生 |
| 最适合 | 独立游戏、2D 游戏、原型 | 中小型商业项目 | 3A 级大作 |
⚠️ 注意:Godot 3 的 C# 支持需要 Mono 版本,标准版仅支持 GDScript。
下载与安装
方法一:官网下载(推荐)
- 访问 Godot 官网下载页
- 选择 Godot 3.6(标准版或 Mono 版)
- 下载对应平台的压缩包
方法二:Steam 安装
在 Steam 搜索 “Godot Engine”,选择 3.x 版本安装。
方法三:包管理器安装
# Linux (Flatpak)
flatpak install flathub org.godotengine.Godot3
# macOS (Homebrew)
brew install --cask godot
# Windows (Scoop)
scoop install godot
安装验证
解压后直接运行可执行文件,无需安装步骤:
# Linux
chmod +x Godot_v3.6-stable_linux.x86_64
./Godot_v3.6-stable_linux.x86_64
💡 提示:Godot 是便携式程序,所有配置保存在 ~/.config/godot/(Linux)或 %APPDATA%\Godot\(Windows)。
项目创建与目录结构
创建新项目
- 启动 Godot,点击 “新建项目”
- 输入项目名称,如
MyFirstGame - 选择渲染器:GLES3(高质量)或 GLES2(兼容性好)
- 选择项目路径并点击 “创建并编辑”
标准项目目录结构
MyFirstGame/
├── .godot/ # 引擎内部缓存(不要手动修改)
├── export/ # 导出输出目录
├── scenes/ # 场景文件 (.tscn)
├── scripts/ # GDScript 脚本 (.gd)
├── assets/
│ ├── sprites/ # 图片资源
│ ├── audio/ # 音频资源
│ └── fonts/ # 字体文件
├── project.godot # 项目配置文件
└── default_env.tres # 默认环境资源
💡 提示:Godot 不强制目录结构,但良好的组织有助于项目管理。
编辑器布局
Godot 编辑器由以下核心面板组成:
| 面板 | 位置 | 功能 |
|---|---|---|
| Scene | 左上 | 场景树,管理当前场景的节点层次 |
| Inspector | 右侧 | 查看和编辑选中节点的属性 |
| FileSystem | 左下 | 项目文件浏览器 |
| Output | 底部 | 输出日志、错误信息 |
| Toolbar | 顶部 | 运行、停止、调试工具 |
| Viewport | 中央 | 场景可视化编辑区 |
自定义布局
可以拖拽面板标签来重新排列布局,通过 Editor → Editor Settings → Layouts 保存。
运行第一个场景
创建一个简单的 2D 场景
- 点击 Scene 面板的 “2D Scene” 按钮
- 默认创建一个 Node2D 根节点
- 右键根节点 → Add Child Node → 选择 Sprite
- 在 Inspector 中为 Sprite 的 Texture 属性拖入一张图片
- 按 F5 运行场景
为根节点添加一个脚本,实现简单的旋转:
extends Node2D
# 旋转速度(弧度/秒)
var rotation_speed: float = 2.0
func _ready() -> void:
print("场景已加载!")
func _process(delta: float) -> void:
# 每帧旋转 Sprite
$Sprite.rotation += rotation_speed * delta
按 F5 运行后,你会看到 Sprite 持续旋转。
导出第一个游戏
设置导出模板
- 菜单:Editor → Manage Export Templates
- 下载对应平台的导出模板
配置导出预设
- 菜单:Project → Export
- 点击 “Add…” 选择目标平台(如 Windows Desktop)
- 配置导出选项
执行导出
# 命令行导出(CI/CD 友好)
godot --export "Windows Desktop" ./export/my_game.exe
godot --export "Linux/X11" ./export/my_game.x86_64
godot --export "HTML5" ./export/my_game.html
⚠️ 注意:导出前必须先下载对应平台的 Export Templates。
GDScript vs C# 选择
| 对比项 | GDScript | C# |
|---|---|---|
| 语法 | 类 Python | 类 Java/C# |
| 类型系统 | 可选类型注解 | 强类型 |
| 运行速度 | 🟡 中等 | 🟢 较快 |
| 学习曲线 | 🟢 简单 | 🟡 中等 |
| IDE 支持 | 内置编辑器 | VS Code / Rider |
| 适用场景 | 快速原型、中小项目 | 大型项目、性能敏感 |
| Godot 3 支持 | ✅ 标准版 | ⚠️ 仅 Mono 版 |
GDScript 示例
extends Node
func greet(name: String) -> String:
return "Hello, " + name + "!"
func _ready() -> void:
var message: String = greet("Godot")
print(message) # 输出: Hello, Godot!
等价的 C# 示例
using Godot;
public class Main : Node
{
public string Greet(string name)
{
return "Hello, " + name + "!";
}
public override void _Ready()
{
string message = Greet("Godot");
GD.Print(message);
}
}
💡 提示:初学者推荐从 GDScript 入门,待项目规模增大后再考虑 C#。
游戏开发场景
场景:创建一个简单的主菜单
一个游戏主菜单通常包含标题、“开始游戏"按钮和"退出"按钮。在 Godot 中,我们可以用 Control 节点快速搭建。
extends Control
func _ready() -> void:
# 连接按钮信号
$StartButton.connect("pressed", self, "_on_start_pressed")
$QuitButton.connect("pressed", self, "_on_quit_pressed")
func _on_start_pressed() -> void:
get_tree().change_scene("res://scenes/Game.tscn")
func _on_quit_pressed() -> void:
get_tree().quit()