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

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

编辑器界面与工作流

编辑器概览

Godot 编辑器是一个集成开发环境(IDE),集场景编辑、脚本编写、资源管理、调试于一体。

┌─────────────────────────────────────────────────────────┐
│  Toolbar: 运行(F5) | 停止(F8) | 调试 | 编辑器设置      │
├──────────┬──────────────────────────────┬───────────────┤
│  Scene   │                              │  Inspector    │
│  Panel   │      Viewport (中央视口)     │  Panel        │
│          │                              │               │
│  节点树   │                              │  属性编辑器    │
├──────────┼──────────────────────────────┤  脚本变量      │
│ FileSystem│   Output / Debugger / Audio │  Node 信号    │
│  文件浏览 │       底部面板              │               │
└──────────┴──────────────────────────────┴───────────────┘

场景面板与节点管理

场景面板(Scene Panel)显示当前场景的节点树结构。

节点操作

操作方法快捷键
添加子节点右键 → Add Child NodeCtrl+A
删除节点右键 → DeleteDelete
重命名节点双击节点名F2
复制节点右键 → DuplicateCtrl+D
禁用节点点击节点旁的图标
场景实例化拖入 .tscn 文件
另存为场景右键 → Save Branch as Scene

节点类型速查

类别常用节点用途
2DNode2D, Sprite, AnimatedSprite2D 游戏对象
3DSpatial, MeshInstance, Camera3D 游戏对象
UIControl, 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文本/二进制场景文件
脚本.gdGDScript 脚本
资源.tres / .res文本/二进制资源文件
图片.png, .jpg, .svg纹理资源
音频.ogg, .wav, .mp3音频文件
字体.ttf, .otf字体文件
着色器.shader着色器代码
3D 模型.obj, .glb, .gltf3D 模型

资源导入设置

选中一个图片文件后,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错误和警告列表
Outputprint() 输出
Audio音频总线监视
ProfilerCPU/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/modeviewport / 2d / disabled
拉伸比例display/window/stretch/aspectkeep / expand / ignore
全屏display/window/size/fullscreentrue / false
可调整大小display/window/size/resizabletrue / 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)

扩展阅读