强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 中最强大的动画工具。

创建动画

  1. 添加 AnimationPlayer 节点
  2. 选中后,底部出现 Animation 面板
  3. 点击 “New” 创建新动画
  4. 在时间线上添加关键帧

动画编辑器关键操作

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 值
  1. 在脚本编辑器中点击行号左侧设置断点(F9)
  2. 按 F5 启动调试运行
  3. 程序会在断点处暂停
  4. 在 Debugger 面板查看变量值

TileMap 编辑

TileMap 是 2D 游戏中创建地图的标准方式。

创建 TileMap

  1. 添加 TileMap 节点
  2. 在 Inspector 中新建或加载 TileSet 资源
  3. 打开底部的 TileMap 面板
  4. 选择图块并在视口中绘制

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)

场景继承

场景继承允许基于现有场景创建新场景。

使用场景继承

  1. Scene → New Inherited Scene
  2. 选择作为基类的 .tscn 文件
  3. 可以添加、修改子节点
  4. 保存为新的 .tscn 文件

场景继承示例

BaseEnemy.tscn (基类场景)
├── KinematicBody2D
│   ├── Sprite
│   ├── CollisionShape2D
│   └── Area2D (检测范围)
│       └── CollisionShape2D

Slime.tscn (继承自 BaseEnemy)
├── KinematicBody2D [继承]
│   ├── Sprite [修改: slime.png]
│   ├── CollisionShape2D [继承]
│   └── Area2D [继承]
└── AnimationPlayer [新增]

⚠️ 注意:子场景中修改的属性会覆盖父场景,未修改的会跟随父场景更新。

资源导入

图片导入

Godot 支持 PNG、JPG、SVG、BMP 等格式。

像素画设置建议

  1. 选中图片 → Import 面板
  2. Compress Mode → Lossless
  3. Mipmaps → 关闭
  4. Filter → Nearest(禁用滤波,保持像素清晰)
  5. 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)

扩展阅读