Godot 3 GDScript 教程 / 编辑器界面与工作流
编辑器界面与工作流
编辑器概览
Godot 编辑器是一个集成开发环境(IDE),集场景编辑、脚本编写、资源管理、调试于一体。
┌─────────────────────────────────────────────────────────┐
│ Toolbar: 运行(F5) | 停止(F8) | 调试 | 编辑器设置 │
├──────────┬──────────────────────────────┬───────────────┤
│ Scene │ │ Inspector │
│ Panel │ Viewport (中央视口) │ Panel │
│ │ │ │
│ 节点树 │ │ 属性编辑器 │
├──────────┼──────────────────────────────┤ 脚本变量 │
│ FileSystem│ Output / Debugger / Audio │ Node 信号 │
│ 文件浏览 │ 底部面板 │ │
└──────────┴──────────────────────────────┴───────────────┘
场景面板与节点管理
场景面板(Scene Panel)显示当前场景的节点树结构。
节点操作
| 操作 | 方法 | 快捷键 |
|---|---|---|
| 添加子节点 | 右键 → Add Child Node | Ctrl+A |
| 删除节点 | 右键 → Delete | Delete |
| 重命名节点 | 双击节点名 | F2 |
| 复制节点 | 右键 → Duplicate | Ctrl+D |
| 禁用节点 | 点击节点旁的图标 | — |
| 场景实例化 | 拖入 .tscn 文件 | — |
| 另存为场景 | 右键 → Save Branch as Scene | — |
节点类型速查
| 类别 | 常用节点 | 用途 |
|---|---|---|
| 2D | Node2D, Sprite, AnimatedSprite | 2D 游戏对象 |
| 3D | Spatial, MeshInstance, Camera | 3D 游戏对象 |
| UI | Control, Label, Button, TextureRect | 用户界面 |
| 物理 | RigidBody2D, Area2D, KinematicBody2D | 物理模拟 |
| 音频 | AudioStreamPlayer, AudioStreamPlayer2D | 音效播放 |
| 容器 | Node, Timer, Tween | 逻辑组织 |
检查器面板(Inspector)
Inspector 显示选中节点的所有可编辑属性。
属性类型
Sprite 节点属性示例:
├── Transform
│ ├── Position: (100, 200)
│ ├── Rotation: 45°
│ └── Scale: (1, 1)
├── Texture: res://assets/sprites/player.png
├── Offset: (0, 0)
├── Flip H: ☐
├── Flip V: ☐
└── Visibility
├── Visible: ☑
└── Modulate: #FFFFFF
导出变量到 Inspector
通过 export 关键字,可以在脚本中定义变量并在 Inspector 中编辑:
extends Sprite
# 导出不同类型变量
export var speed: float = 200.0
export var health: int = 100
export var color: Color = Color.white
export(Texture) var my_texture
export(Vector2) var direction = Vector2.RIGHT
# 带范围限制
export(float, 0.0, 10.0, 0.1) var volume = 1.0
export(int, 1, 100) var max_health = 100
# 枚举导出
enum EnemyType { SLIME, GOBLIN, DRAGON }
export(EnemyType) var enemy_type = EnemyType.SLIME
💡 提示:导出变量使得非程序员也能通过 Inspector 调整游戏参数。
文件系统管理
FileSystem 面板管理项目的所有资源文件。
资源类型与扩展名
| 资源类型 | 扩展名 | 说明 |
|---|---|---|
| 场景 | .tscn / .scn | 文本/二进制场景文件 |
| 脚本 | .gd | GDScript 脚本 |
| 资源 | .tres / .res | 文本/二进制资源文件 |
| 图片 | .png, .jpg, .svg | 纹理资源 |
| 音频 | .ogg, .wav, .mp3 | 音频文件 |
| 字体 | .ttf, .otf | 字体文件 |
| 着色器 | .shader | 着色器代码 |
| 3D 模型 | .obj, .glb, .gltf | 3D 模型 |
资源导入设置
选中一个图片文件后,Import 面板会显示导入选项:
| 设置 | 说明 | 推荐值 |
|---|---|---|
| Import As | 导入类型 | Texture |
| Compress | 压缩模式 | Video RAM(游戏中) |
| Mipmaps | 多级纹理 | 3D 用,2D 关闭 |
| Fix Alpha Border | 修复边缘 | 像素画开启 |
| Size Limit | 尺寸限制 | 0(不限制) |
⚠️ 注意:修改导入设置后需点击 “Reimport” 生效。
动画编辑器(AnimationPlayer)
AnimationPlayer 是 Godot 中最强大的动画工具。
创建动画
- 添加 AnimationPlayer 节点
- 选中后,底部出现 Animation 面板
- 点击 “New” 创建新动画
- 在时间线上添加关键帧
动画编辑器关键操作
extends Node2D
onready var anim_player = $AnimationPlayer
func _ready() -> void:
# 播放动画
anim_player.play("walk")
# 带过渡播放
anim_player.play("attack", 0.2)
# 停止动画
anim_player.stop()
func _on_animation_finished(anim_name: String) -> void:
if anim_name == "attack":
anim_player.play("idle")
动画轨道类型
| 轨道类型 | 用途 |
|---|---|
| Property Track | 修改节点属性(位置、旋转、颜色等) |
| Call Method Track | 在指定时间调用函数 |
| Bezier Track | 贝塞尔曲线控制属性变化 |
| Audio Track | 播放音频片段 |
| Animation Track | 播放其他动画(嵌套) |
调试面板
调试器功能
| 面板 | 功能 |
|---|---|
| Debugger | 断点调试、变量监视 |
| Errors | 错误和警告列表 |
| Output | print() 输出 |
| Audio | 音频总线监视 |
| Profiler | CPU/GPU 性能分析 |
| Network Profiler | 网络流量分析 |
| Visual Profiler | 渲染管线分析 |
| Monitors | 实时性能图表 |
断点使用
func calculate_damage(base: int, multiplier: float) -> int:
var damage = base * multiplier # ← 在此行设置断点 (F9)
var crit = randf() < 0.2
if crit:
damage *= 2.0
return int(damage) # ← 在此行监视 damage 值
- 在脚本编辑器中点击行号左侧设置断点(F9)
- 按 F5 启动调试运行
- 程序会在断点处暂停
- 在 Debugger 面板查看变量值
TileMap 编辑
TileMap 是 2D 游戏中创建地图的标准方式。
创建 TileMap
- 添加 TileMap 节点
- 在 Inspector 中新建或加载 TileSet 资源
- 打开底部的 TileMap 面板
- 选择图块并在视口中绘制
TileMap 常用操作
| 操作 | 快捷键 |
|---|---|
| 绘制图块 | 鼠标左键 |
| 擦除图块 | 鼠标右键 |
| 矩形绘制 | Shift + 鼠标左键 |
| 吸管工具 | I |
| 填充工具 | G |
| 擦除矩形 | Shift + 鼠标右键 |
通过代码操作 TileMap
extends TileMap
func _ready() -> void:
# 设置图块 (cell坐标, tile_id)
set_cell(0, 0, 1)
set_cell(1, 0, 2)
# 获取图块
var tile_id = get_cell(0, 0)
print("图块 ID: ", tile_id)
# 清除图块
set_cell(0, 0, -1)
# 世界坐标转格子坐标
var mouse_pos = get_global_mouse_position()
var cell_pos = world_to_map(mouse_pos)
print("鼠标所在格子: ", cell_pos)
func place_tile(world_pos: Vector2, tile_id: int) -> void:
var cell = world_to_map(world_pos)
set_cellv(cell, tile_id)
场景继承
场景继承允许基于现有场景创建新场景。
使用场景继承
- Scene → New Inherited Scene
- 选择作为基类的
.tscn文件 - 可以添加、修改子节点
- 保存为新的
.tscn文件
场景继承示例
BaseEnemy.tscn (基类场景)
├── KinematicBody2D
│ ├── Sprite
│ ├── CollisionShape2D
│ └── Area2D (检测范围)
│ └── CollisionShape2D
Slime.tscn (继承自 BaseEnemy)
├── KinematicBody2D [继承]
│ ├── Sprite [修改: slime.png]
│ ├── CollisionShape2D [继承]
│ └── Area2D [继承]
└── AnimationPlayer [新增]
⚠️ 注意:子场景中修改的属性会覆盖父场景,未修改的会跟随父场景更新。
资源导入
图片导入
Godot 支持 PNG、JPG、SVG、BMP 等格式。
像素画设置建议:
- 选中图片 → Import 面板
- Compress Mode → Lossless
- Mipmaps → 关闭
- Filter → Nearest(禁用滤波,保持像素清晰)
- Fix Alpha Border → 开启
音频导入
| 格式 | 特点 | 推荐用途 |
|---|---|---|
.ogg | 有损压缩,体积小 | 背景音乐 |
.wav | 无损,体积大 | 短音效 |
.mp3 | 有损压缩 | 音乐(OGG 的替代) |
⚠️ 注意:音频导入设置中,Loop 选项对背景音乐很重要,需手动开启。
3D 模型导入
支持 .obj、.glb、.gltf、.dae 等格式。
extends Spatial
func _ready() -> void:
# 加载并实例化 3D 场景
var model = load("res://assets/models/Robot.glb").instance()
add_child(model)
# 或使用 ResourceInteractiveLoader 异步加载
# var loader = ResourceLoader.load_interactive("res://assets/models/BigModel.glb")
快捷键速查表
通用操作
| 快捷键 | 功能 |
|---|---|
| Ctrl+S | 保存当前场景 |
| Ctrl+Shift+S | 另存为 |
| Ctrl+Z | 撤销 |
| Ctrl+Y / Ctrl+Shift+Z | 重做 |
| F5 | 运行项目 |
| F6 | 运行当前场景 |
| F7 | 停止 |
| F8 | 停止 |
| F9 | 切换断点 |
| F10 | 单步跳过 |
| F11 | 单步进入 |
| Ctrl+P | 快速打开资源 |
2D 视口操作
| 快捷键 | 功能 |
|---|---|
| 鼠标中键拖拽 | 平移视口 |
| 滚轮 | 缩放 |
| Q | 选择工具 |
| W | 移动工具 |
| E | 旋转工具 |
| R | 缩放工具 |
| S | 自由变换 |
| T | 智能吸附 |
| G | 切换网格 |
| Ctrl+G | 切换辅助线 |
脚本编辑器
| 快捷键 | 功能 |
|---|---|
| Ctrl+Click | 跳转到定义 |
| Ctrl+F | 查找 |
| Ctrl+H | 替换 |
| Ctrl+Shift+F | 全局查找 |
| Ctrl+/ | 注释/取消注释 |
| Ctrl+D | 复制行 |
| Ctrl+K | 删除行 |
| Tab | 缩进 |
| Shift+Tab | 减少缩进 |
项目设置详解
打开项目设置
Project → Project Settings(快捷键:无)
常用配置项
显示窗口
| 设置 | 路径 | 说明 |
|---|---|---|
| 窗口大小 | display/window/size/width, height | 设计分辨率 |
| 拉伸模式 | display/window/stretch/mode | viewport / 2d / disabled |
| 拉伸比例 | display/window/stretch/aspect | keep / expand / ignore |
| 全屏 | display/window/size/fullscreen | true / false |
| 可调整大小 | display/window/size/resizable | true / false |
输入映射
Project Settings → Input Map
添加自定义输入动作:
func _ready() -> void:
# 代码中添加输入映射
InputMap.add_action("jump")
var event = InputEventKey.new()
event.scancode = KEY_SPACE
InputMap.action_add_event("jump", event)
自动加载(Autoload)
Autoload 是全局单例,在项目启动时自动加载:
| 用途 | 常见 Autoload 名 |
|---|---|
| 全局数据管理 | GameManager |
| 音频管理 | AudioManager |
| 场景切换 | SceneManager |
| 存档系统 | SaveManager |
| 全局信号 | EventBus |
# res://scripts/GameManager.gd
extends Node
var score: int = 0
var level: int = 1
var player_name: String = ""
func reset() -> void:
score = 0
level = 1
func add_score(points: int) -> void:
score += points
emit_signal("score_changed", score)
signal score_changed(new_score)
在 Project → Project Settings → Autoload 中添加:
- Path:
res://scripts/GameManager.gd - Name:
GameManager
之后可以在任何脚本中使用:
func _on_enemy_killed() -> void:
GameManager.add_score(100)
游戏开发场景
场景:快速搭建关卡原型
在开发新关卡时,常用的工作流程是:创建一个基础场景 → 添加 TileMap 绘制地形 → 放置敌人和道具实例 → 测试运行。
# 关卡场景脚本
extends Node2D
var enemy_scene = preload("res://scenes/Enemy.tscn")
var coin_scene = preload("res://scenes/Coin.tscn")
func _ready() -> void:
# 从关卡数据加载敌人和道具位置
spawn_enemy(Vector2(300, 200))
spawn_enemy(Vector2(600, 200))
spawn_coin(Vector2(450, 150))
func spawn_enemy(pos: Vector2) -> void:
var enemy = enemy_scene.instance()
enemy.position = pos
$Enemies.add_child(enemy)
func spawn_coin(pos: Vector2) -> void:
var coin = coin_scene.instance()
coin.position = pos
$Coins.add_child(coin)