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

Godot 4 GDScript 教程 / 编辑器界面与工作流

编辑器界面与工作流

熟练掌握 Godot 编辑器界面和工作流能显著提升开发效率。本章详细介绍各个面板功能、常用编辑器操作、快捷键以及高效工作流技巧。

1. 编辑器主界面

Godot 4 编辑器由以下核心面板组成:

┌─────────────────────────────────────────────────────────────┐
│  菜单栏:场景 | 项目 | 调试 | 编辑器 | 帮助                   │
├──────────┬──────────────────────────────┬───────────────────┤
│          │                              │                   │
│  场景面板 │       2D/3D 视口             │    检查器         │
│  Scene   │       Viewport              │    Inspector      │
│          │                              │                   │
│          │                              │                   │
├──────────┼──────────────────────────────┤                   │
│          │                              │                   │
│  文件系统 │    脚本编辑器 / 着色器编辑器   │                   │
│  FileSystem│                             │                   │
│          │                              │                   │
└──────────┴──────────────────────────────┴───────────────────┘
│  底部面板:输出 | 调试器 | 音频 | 动画 | 瓦片地图               │
└─────────────────────────────────────────────────────────────┘

1.1 场景面板(Scene Dock)

功能操作说明
添加节点点击 “+” 或按 Ctrl+A从节点列表选择
删除节点选中后按 Delete删除节点及其子节点
复制节点Ctrl+D复制选中节点
右键菜单右键点击节点更多操作选项
改变父子关系拖拽节点重新组织场景树
重命名双击节点名称为节点命名
# 通过代码操作场景树
func _ready() -> void:
    # 获取场景树根节点
    var tree = get_tree()
    
    # 获取当前场景根节点
    var current_scene = tree.current_scene
    print("当前场景: %s" % current_scene.name)
    
    # 获取节点数量
    var node_count = current_scene.get_child_count()
    print("子节点数量: %d" % node_count)
    
    # 遍历场景树
    print_tree()

💡 提示: 给节点起有意义的名称(如 Player、Enemy、UI)比使用默认名称(Sprite2D、Node2D)更便于管理。

1.2 检查器面板(Inspector Dock)

功能说明
属性编辑修改选中节点的属性
资源分配将资源拖拽到对应属性
分组显示按类别折叠/展开属性
重置属性右键 → 重置为默认值
复制/粘贴右键 → 复制/粘贴属性值
脚本变量显示 @export 导出的变量
# 使用 @export 让变量在检查器中可见
extends Sprite2D

@export var move_speed: float = 200.0
@export var health: int = 100
@export var sprite_texture: Texture2D
@export var enemy_color: Color = Color.RED

# 分组导出
@export_group("Movement")
@export var max_speed: float = 300.0
@export var acceleration: float = 50.0
@export var friction: float = 0.1

@export_group("Combat")
@export var attack_damage: int = 25
@export var attack_range: float = 50.0

# 子分组
@export_group("Advanced")
@export_subgroup("Physics")
@export var gravity_scale: float = 1.0
@export var bounce_factor: float = 0.5

⚠️ 注意: 检查器中修改的值是实例属性,只影响当前节点实例;脚本中的默认值影响所有实例。

1.3 文件系统面板(FileSystem Dock)

操作方法
创建文件夹右键 → 新建文件夹
创建脚本右键 → 新建脚本
创建场景右键 → 新建场景
创建资源右键 → 新建资源
导入文件直接拖拽文件到面板
重新导入右键 → 重新导入
设为默认导入右键 → 新建导入预设
推荐的文件系统组织:
res://
├── scenes/          # .tscn 场景文件
├── scripts/         # .gd 脚本文件(无场景的纯脚本)
├── resources/       # .tres 自定义资源
├── assets/
│   ├── sprites/     # 图片
│   ├── audio/       # 音频
│   ├── fonts/       # 字体
│   └── animations/  # 动画
├── shaders/         # 着色器
└── addons/          # 插件

2. 2D 视口操作

2.1 导航操作

操作快捷键/方式说明
平移鼠标中键拖拽移动视口
缩放滚轮放大/缩小视口
框选拖拽选择选中多个节点
聚焦选中F将视口中心对准选中节点
全部显示Shift+F在视口中显示所有内容
切换网格显示菜单显示/隐藏编辑器网格

2.2 2D 变换工具

工具快捷键功能
移动W移动选中节点
旋转E旋转选中节点
缩放S缩放选中节点
自由变换Ctrl+Shift+T综合变换
# 代码中的 2D 变换
extends Node2D

func _ready() -> void:
    # 位置
    position = Vector2(100, 200)
    
    # 旋转(弧度)
    rotation = deg_to_rad(45)
    
    # 缩放
    scale = Vector2(2, 2)
    
    # 全局变换
    global_position = Vector2(500, 300)
    
    # 使用 Transform2D
    var transform = Transform2D(deg_to_rad(30), Vector2(200, 100))

3. 3D 视口操作

3.1 导航操作

操作快捷键/方式说明
环绕旋转Alt + 鼠标左键围绕焦点旋转
平移鼠标中键拖拽平移视口
缩放滚轮 / Alt + 右键前后缩放
飞行模式Shift+鼠标中键自由飞行
聚焦选中F聚焦到选中物体
切换视角数字键 1/3/7正面/侧面/顶部

3.2 3D 操纵工具

工具快捷键功能
移动W三轴移动手柄
旋转E三轴旋转手柄
缩放R三轴缩放手柄
自由变换Y综合变换

4. 调试器(Debugger)

4.1 调试面板

标签页功能
调试器显示断点、调用栈、变量值
监视添加自定义监视表达式
性能监视器FPS、内存、渲染统计
网络分析器网络流量监控
视觉分析器可视化性能瓶颈
# 调试工具函数
func _ready() -> void:
    # 打印调试信息
    print("节点路径: %s" % get_path())
    print("场景树: %s" % str(get_tree().root))
    
    # 断言(调试模式下生效)
    assert(health > 0, "生命值必须大于 0")
    
    # 条件断点:在脚本编辑器中点击行号左侧设置断点
    # 右键断点可以设置条件,例如:health < 50

    # 推送错误/警告到调试控制台
    push_warning("这是一个警告")
    push_error("这是一个错误")

    # 性能监控
    print("FPS: %d" % Performance.get_monitor(Performance.TIME_FPS))
    print("对象数量: %d" % Performance.get_monitor(Performance.OBJECT_COUNT))
    print("内存: %d MB" % (Performance.get_monitor(Performance.MEMORY_STATIC) / 1048576))

4.2 调试快捷键

快捷键功能
F5运行项目
F6运行当前场景
F7单步跳过(调试中)
F8步入(调试中)
F9切换断点
F12步出(调试中)
Ctrl+Shift+F5调试运行项目
Ctrl+Shift+F6调试运行场景

5. 动画编辑器

5.1 AnimationPlayer 使用

# AnimationPlayer 使用示例
extends CharacterBody2D

@onready var anim_player: AnimationPlayer = $AnimationPlayer
@onready var sprite: Sprite2D = $Sprite2D

var is_attacking: bool = false

func play_animation(anim_name: String) -> void:
    if anim_player.has_animation(anim_name):
        anim_player.play(anim_name)

func attack() -> void:
    if is_attacking:
        return
    is_attacking = true
    anim_player.play("attack")
    await anim_player.animation_finished
    is_attacking = false

func _physics_process(delta: float) -> void:
    if is_attacking:
        return
    
    if velocity.length() > 0:
        play_animation("run")
    else:
        play_animation("idle")

5.2 创建动画关键帧

在编辑器中操作:

  1. 选中 AnimationPlayer 节点
  2. 点击底部 “动画” 面板
  3. 点击 “新建” 创建动画
  4. 在时间线上点击关键帧按钮记录属性
动画轨道类型:
- 属性轨道:记录节点属性变化(位置、旋转、颜色等)
- 方法轨道:在指定时间调用函数
- Bezier 轨道:贝塞尔曲线控制的平滑动画
- 音频轨道:播放音频片段
- 子动画轨道:嵌套播放其他动画

💡 提示: 使用 AnimationMixer(Godot 4.3+)可以更高效地管理和混合多个动画。

6. TileMap 编辑器

6.1 TileMap 新系统

Godot 4 的 TileMap 系统经过全面重写:

# TileMapLayer 使用示例(Godot 4.3+推荐)
extends TileMapLayer

# 地图尺寸
const MAP_WIDTH: int = 50
const MAP_HEIGHT: int = 30

func _ready() -> void:
    generate_random_map()

func generate_random_map() -> void:
    for x in range(MAP_WIDTH):
        for y in range(MAP_HEIGHT):
            var tile_id: int
            if y > MAP_HEIGHT * 0.7:
                tile_id = 1  # 地面
            elif y > MAP_HEIGHT * 0.5:
                tile_id = 2  # 草地
            else:
                tile_id = 0  # 空气
            
            set_cell(Vector2i(x, y), tile_id, Vector2i.ZERO)

func get_tile_at(world_pos: Vector2) -> Vector2i:
    return local_to_map(to_local(world_pos))

func set_tile_at(world_pos: Vector2, tile_id: int) -> void:
    var map_pos = local_to_map(to_local(world_pos))
    set_cell(map_pos, tile_id, Vector2i.ZERO)

6.2 TileSet 资源配置

设置项说明
瓦片大小每个瓦片的像素尺寸
瓦片形状正方形、六角形、等距
物理层配置碰撞形状
导航层配置导航区域
地形集自动地形贴图规则

7. 信号面板

7.1 信号连接界面

在 Godot 编辑器中连接信号:

  1. 选中发出信号的节点
  2. 点击检查器旁的 “节点” 标签页
  3. 双击要连接的信号
  4. 选择接收信号的节点
  5. 选择或输入处理函数名
# 代码方式连接信号
extends Node2D

@onready var button: Button = $Button
@onready var timer: Timer = $Timer
@onready var area: Area2D = $Area2D

func _ready() -> void:
    # 新语法:使用 Callable
    button.pressed.connect(_on_button_pressed)
    timer.timeout.connect(_on_timer_timeout)
    area.body_entered.connect(_on_area_body_entered)
    
    # 带参数的信号
    area.body_entered.connect(_on_body_entered_with_arg.bind("敌人区域"))

func _on_button_pressed() -> void:
    print("按钮被点击")

func _on_timer_timeout() -> void:
    print("定时器超时")

func _on_area_body_entered(body: Node2D) -> void:
    print("物体进入: %s" % body.name)

func _on_body_entered_with_arg(body: Node2D, area_name: String) -> void:
    print("%s 进入了 %s" % [body.name, area_name])

8. 编辑器布局自定义

8.1 保存和加载布局

操作菜单路径
保存布局编辑器 → 编辑器布局 → 保存
加载布局编辑器 → 编辑器布局 → 选择布局
删除布局编辑器 → 编辑器布局 → 删除
重置布局编辑器 → 编辑器布局 → 默认

8.2 推荐布局

2D 游戏开发布局:
┌─────┬────────────────────┬─────┐
│场景 │     2D 视口         │检查器│
│     │                    │     │
├─────┼────────────────────┤     │
│文件  │   脚本编辑器        │     │
└─────┴────────────────────┴─────┘

3D 游戏开发布局:
┌─────┬────────────────────┬─────┐
│场景 │     3D 视口         │检查器│
│     │                    │     │
├─────┼────────────────────┤     │
│文件  │   脚本编辑器        │     │
└─────┴────────────────────┴─────┘

9. 资源导入设置

9.1 图片导入

设置推荐值说明
压缩模式Lossless (像素图) / VRAM (大纹理)根据美术风格选择
尺寸限制2的幂次优化内存对齐
过滤Nearest (像素图) / Linear (3D)根据美术风格选择
Mipmaps3D 开 / 2D 关3D 远距离纹理优化

9.2 音频导入

设置推荐值说明
音乐OGG Vorbis有损压缩,文件小
音效WAV 或 OGG根据音效长度选择
循环勾选 Loop背景音乐需要
混合率44100 Hz标准采样率

10. 快捷键速查表

10.1 通用快捷键

快捷键功能
Ctrl+S保存场景
Ctrl+Shift+S另存为
Ctrl+Z撤销
Ctrl+Y / Ctrl+Shift+Z重做
Ctrl+C / V / X复制/粘贴/剪切
Ctrl+D复制节点
Delete删除选中
Ctrl+A添加新节点
Ctrl+P快速查找文件
Ctrl+Shift+P命令面板

10.2 2D 视口快捷键

快捷键功能
W移动工具
E旋转工具
S缩放工具
F聚焦选中
Shift+F显示全部
G切换网格
Ctrl+Shift+T自由变换

10.3 脚本编辑器快捷键

快捷键功能
Ctrl+Click跳转到定义
Ctrl+F查找
Ctrl+H查找替换
Ctrl+G跳转到行
Ctrl+/切换注释
Ctrl+Shift+F全局查找
Tab缩进
Shift+Tab取消缩进

11. 游戏开发场景

场景:高效关卡设计工作流

# 使用 @tool 脚本在编辑器中实时预览
@tool
extends Node2D

# 在编辑器中显示自定义绘制
@export var room_size: Vector2 = Vector2(320, 240):
    set(value):
        room_size = value
        queue_redraw()

@export var room_color: Color = Color(0.2, 0.3, 0.5, 0.5):
    set(value):
        room_color = value
        queue_redraw()

@export var show_grid: bool = true:
    set(value):
        show_grid = value
        queue_redraw()

func _draw() -> void:
    # 只在编辑器中绘制
    if not Engine.is_editor_hint():
        return
    
    # 绘制房间轮廓
    draw_rect(Rect2(-room_size / 2, room_size), room_color)
    draw_rect(Rect2(-room_size / 2, room_size), Color.WHITE, false, 2.0)
    
    # 绘制网格
    if show_grid:
        var grid_step = 32.0
        for x in range(-room_size.x / 2, room_size.x / 2, grid_step):
            var from = Vector2(x, -room_size.y / 2)
            var to = Vector2(x, room_size.y / 2)
            draw_line(from, to, Color(1, 1, 1, 0.1))
        for y in range(-room_size.y / 2, room_size.y / 2, grid_step):
            var from = Vector2(-room_size.x / 2, y)
            var to = Vector2(room_size.x / 2, y)
            draw_line(from, to, Color(1, 1, 1, 0.1))
    
    # 绘制门标记
    draw_circle(Vector2(0, -room_size.y / 2), 8, Color.GREEN)
    draw_circle(Vector2(0, room_size.y / 2), 8, Color.GREEN)

⚠️ 注意: @tool 脚本在编辑器中运行,请谨慎处理,避免在 _process_physics_process 中执行破坏性操作。

12. 扩展阅读


上一章: 02 - 安装与项目设置 下一章: 04 - GDScript 2.0 基础语法