Godot 节点系统详细介绍

2026-05-26
672523 分钟
...

Godot 里最核心的东西不是“类”,也不是“组件”,而是节点 Node

你可以把 Godot 的节点理解成:

在前端里,一个页面是由很多 DOM 元素组成的;
在 Godot 里,一个游戏场景是由很多 Node 节点组成的。

比如一个玩家角色,可能不是一个单独对象,而是这样的结构:

Player / CharacterBody2D
  ├── Sprite2D
  ├── AnimationPlayer
  ├── CollisionShape2D
  ├── Camera2D
  └── AudioStreamPlayer2D

这里的 Player 是根节点,下面挂着显示图片、播放动画、碰撞检测、摄像机、音效等子节点。

Godot 官方文档也把节点和场景放在一起讲:多个节点组成树状结构后,就可以保存成一个 Scene 场景,而场景保存后又可以像一种新的节点类型一样被复用。

一、Node 是什么

Node 是 Godot 里最基础的节点类型。

它本身不负责显示画面,也不负责物理碰撞,更不负责 UI 布局。它更像是一个“逻辑容器”。

它常用来做:

GameManager
SceneManager
AudioManager
QuestManager
InventoryManager
DataLoader

也就是说,如果你有一个东西不需要出现在画面里,只是负责管理逻辑,就可以用普通的 Node

比如:

Main / Node
  ├── World / Node2D
  ├── UI / CanvasLayer
  ├── GameManager / Node
  └── AudioManager / Node

这里 GameManager 不需要坐标,不需要图片,也不需要碰撞,所以用 Node 就够了。

Godot 的场景树 SceneTree 会管理这些节点的添加、删除、暂停、切换场景等行为。节点进入场景树后会触发 _enter_tree(),准备完成后会触发 _ready()

二、节点的生命周期

你写 Godot 脚本时,经常会遇到这些函数:

func _enter_tree():
    pass

func _ready():
    pass

func _process(delta):
    pass

func _physics_process(delta):
    pass

func _exit_tree():
    pass

它们和前端生命周期很像。

_enter_tree()

节点刚进入场景树时执行。

这个时候节点已经被加入树里了,但它的子节点不一定都准备好了。

一般不常用,除非你要做比较底层的初始化。

_ready()

节点和它的子节点都准备好之后执行。

这是你最常用的初始化位置。

比如:

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

func _ready():
    anim.play("idle")

你可以理解为 Vue 的 mounted,或者 React 组件第一次挂载完成之后的效果。

_process(delta)

每一帧执行一次。

适合处理和画面刷新相关的逻辑,比如:

相机跟随
角色朝向鼠标
UI 倒计时
非物理类动画

_physics_process(delta)

固定物理帧执行。

适合处理物理移动、碰撞、速度计算。

比如角色移动一般放这里:

func _physics_process(delta):
    velocity = input_direction * speed
    move_and_slide()

_exit_tree()

节点离开场景树时执行。

适合清理连接、停止计时器、释放状态。

三、节点和场景的关系

Godot 里一个 .tscn 场景文件,本质上就是一棵节点树。

比如你创建一个 Player.tscn

Player / CharacterBody2D
  ├── Sprite2D
  ├── CollisionShape2D
  └── AnimationPlayer

这个 Player.tscn 之后可以被放进主场景:

Main / Node2D
  ├── TileMapLayer
  ├── Player
  ├── Camera2D
  └── CanvasLayer

所以你可以把场景理解成“组件”。

前端类比:

Vue / React 组件 = Godot Scene
DOM 节点 = Godot Node
组件嵌套 = 场景实例嵌套
props / state = 导出变量资源脚本属性

比如:

Player.tscn
Enemy.tscn
Chest.tscn
NPC.tscn
House.tscn

它们都是可以复用的场景。

四、2D 基础节点

1. Node2D

Node2D 是所有 2D 游戏对象最常见的基础节点。

它有:

position 位置
rotation 旋转
scale 缩放
z_index 绘制层级
visible 是否显示

Godot 官方文档说明,Node2D 是 2D 游戏对象的基础,所有 2D 节点,包括精灵、物理对象等,都继承自它;它适合作为父节点来统一移动、旋转、缩放子节点。

常用场景:

地图根节点
玩家根节点
敌人根节点
道具根节点
特效根节点
装饰物根节点

比如:

World / Node2D
  ├── Ground
  ├── Player
  ├── Enemies
  ├── Items
  └── Decorations

如果一个东西存在于 2D 世界里,但暂时不需要碰撞、不需要物理控制,就可以先用 Node2D

例如:

云朵
背景装饰
树叶飘落效果
普通装饰物容器

2. Sprite2D

Sprite2D 用来显示一张 2D 图片。

它一般不会单独作为复杂对象的根节点,而是作为子节点挂在角色、物品、敌人下面。

比如:

Player / CharacterBody2D
  └── Sprite2D

常用场景:

显示玩家图片
显示敌人图片
显示道具图片
显示树石头宝箱
显示技能图标

如果你只是想让一张图片出现在场景里,可以直接用 Sprite2D

但如果这个图片要移动、碰撞、交互,通常会用其他节点作为根节点,再把 Sprite2D 放进去。

比如宝箱:

Chest / Area2D
  ├── Sprite2D
  └── CollisionShape2D

3. AnimatedSprite2D

AnimatedSprite2D 用来播放帧动画。

它适合使用一组图片帧组成的动画,比如:

角色走路
敌人攻击
火焰燃烧
水流动画
金币旋转

它需要配合 SpriteFrames 资源使用。

结构一般是:

Player / CharacterBody2D
  ├── AnimatedSprite2D
  └── CollisionShape2D

如果你有一张角色动作精灵图,可以把它切成多帧,然后放进 AnimatedSprite2D

适合简单动画。

如果动画里还要同时控制碰撞框、音效、武器判定、粒子效果,那更推荐用 AnimationPlayer

4. AnimationPlayer

AnimationPlayer 是 Godot 里非常重要的动画节点。

它不只是播放图片动画,它可以控制几乎任何属性。

比如它可以控制:

Sprite2D texture
Node2D position
Sprite2D modulate
CollisionShape2D 是否启用
AudioStreamPlayer 播放声音
角色攻击时武器判定框开启
UI 面板透明度变化

它适合做更复杂、更精确的动画。

比如攻击动画:

Player / CharacterBody2D
  ├── Sprite2D
  ├── HitBox / Area2D
  ├── CollisionShape2D
  └── AnimationPlayer

攻击开始时:

播放挥剑动画
开启 HitBox 碰撞
播放攻击音效
几帧后关闭 HitBox

这类逻辑用 AnimationPlayer 就很方便。

5. AnimationTree

AnimationTree 是更高级的动画状态机。

它适合角色动画很多的情况。

比如:

idle
walk
run
attack
hurt
death
roll
cast

如果你只用 AnimationPlayer,动画切换逻辑可能会写得很乱。

AnimationTree 可以做:

动画状态机
混合动画
根据方向切换动画
根据速度平滑过渡

一般中后期再用。

初学阶段可以先用 AnimatedSprite2DAnimationPlayer

五、2D 物理节点

2D 物理节点是 Godot 做角色、碰撞、攻击范围、障碍物时最常用的一类。

1. CharacterBody2D

CharacterBody2D 最常用来做“由代码控制移动的角色”。

比如:

玩家
NPC
敌人
可移动怪物
横版游戏角色
俯视角 RPG 角色

官方文档说明,CharacterBody2D 用于通过代码实现控制的身体,它移动时会检测碰撞,但不会自动受到重力、摩擦等物理属性影响;也就是说,它需要你写代码控制移动,但你能获得更精确的控制。

典型结构:

Player / CharacterBody2D
  ├── Sprite2D AnimatedSprite2D
  ├── CollisionShape2D
  ├── AnimationPlayer
  └── Camera2D

俯视角 RPG 玩家一般就用它:

extends CharacterBody2D

@export var speed := 120.0

func _physics_process(delta):
    var direction := Input.get_vector("move_left", "move_right", "move_up", "move_down")
    velocity = direction * speed
    move_and_slide()

适合你的《旧日秘境》这种 RPG 项目。

玩家角色应该优先用:

CharacterBody2D

而不是 RigidBody2D

因为玩家移动通常需要“精准可控”,而不是让物理系统自己算。

2. StaticBody2D

StaticBody2D 用来做不会移动的物理物体。

比如:


石头
房子
树干
桌子
河边障碍
地图边界
不可穿越的山体

典型结构:

Rock / StaticBody2D
  ├── Sprite2D
  └── CollisionShape2D

玩家撞到 StaticBody2D 就会被挡住。

在 RPG 里,常见用法是:

树的底部有碰撞
房子的墙有碰撞
水边不能走
悬崖不能走

如果你用 TileMapLayer 做地图,也可以在 TileSet 里给某些 tile 设置碰撞,这样就不需要每块石头都手动放 StaticBody2D

3. RigidBody2D

RigidBody2D 是受物理系统控制的刚体。

官方文档说明,它实现完整的 2D 物理,不能直接像普通角色那样控制位置,而是应该通过力、冲量、重力等方式影响它。

适合:

会被推开的箱子
会滚动的石头
掉落的物品
被爆炸炸飞的物体
物理弹球
碎片

不适合:

玩家主角
普通 NPC
需要精准路线的敌人
RPG 角色移动

比如一个可以推动的箱子:

Box / RigidBody2D
  ├── Sprite2D
  └── CollisionShape2D

如果你发现自己想写:

rigid_body.position += Vector2(...)

那大概率你用错了,应该改用 CharacterBody2DNode2D

4. Area2D

Area2D 是“检测区域”,不是实体墙。

官方文档说明,Area2D 是一个由 CollisionShape2DCollisionPolygon2D 定义的 2D 区域,它可以检测其他碰撞对象进入、离开,以及当前有哪些对象重叠在区域内。

它常用来做:

攻击范围
拾取范围
传送门
NPC 对话触发区
宝箱交互范围
陷阱区域
怪物警戒范围
进入房屋触发区
剧情触发点

比如宝箱:

Chest / Area2D
  ├── Sprite2D
  └── CollisionShape2D

玩家进入宝箱范围后,显示:

 E 打开宝箱

比如传送门:

DoorArea / Area2D
  └── CollisionShape2D

玩家进入后切换场景。

比如怪物感知范围:

Enemy / CharacterBody2D
  ├── Sprite2D
  ├── CollisionShape2D
  └── DetectArea / Area2D
      └── CollisionShape2D

当玩家进入 DetectArea,怪物开始追击。

5. CollisionShape2D

CollisionShape2D 是碰撞形状。

它自己不能独立工作,必须挂在这些节点下面:

CharacterBody2D
StaticBody2D
RigidBody2D
Area2D

常见形状:

RectangleShape2D 矩形
CircleShape2D 圆形
CapsuleShape2D 胶囊
SegmentShape2D 线段
WorldBoundaryShape2D 世界边界

例如:

Player / CharacterBody2D
  └── CollisionShape2D

如果没有 CollisionShape2D,你的角色虽然是 CharacterBody2D,但它没有实际碰撞体,就像一个没有边界的幽灵。

6. CollisionPolygon2D

CollisionPolygon2D 是多边形碰撞。

适合不规则形状:

山体
湖边
悬崖
大型岩石
不规则建筑

但不要滥用。

简单物体优先用 CollisionShape2D,性能更好,也更容易维护。

六、TileMap 和地图节点

1. TileMapLayer

在 Godot 4.3 之后,TileMap 逐渐被新的 TileMapLayer 工作流取代。TileMapLayer 用于 2D 网格地图,它使用 TileSet 里的图块来绘制地图;和旧的 TileMap 不同,TileMapLayer 只表示一层地图,如果要多层地图,可以使用多个 TileMapLayer

这对 RPG 很重要。

一个地图通常不是一层,而是多层:

World / Node2D
  ├── GroundLayer / TileMapLayer
  ├── DecorationBelowLayer / TileMapLayer
  ├── ObjectLayer / TileMapLayer
  ├── AbovePlayerLayer / TileMapLayer
  └── Player / CharacterBody2D

比如:

GroundLayer草地泥土道路
WaterLayer水面河流
ObjectLayer石头房子
AbovePlayerLayer树冠屋顶桥上层

对于你现在做的 RPG,建议地图结构这样分:

Map_Forest / Node2D
  ├── Ground / TileMapLayer
  ├── Water / TileMapLayer
  ├── Objects / TileMapLayer
  ├── AbovePlayer / TileMapLayer
  ├── YSortObjects / Node2D
  ├── Player / CharacterBody2D
  └── Camera2D

2. TileSet

TileSet 不是节点,而是资源。

但它和地图强相关。

它负责定义:

每个 tile 对应图片哪一块
哪些 tile 有碰撞
哪些 tile 是地形连接
哪些 tile 有导航
哪些 tile 有自定义数据

比如你有一张 32x32 的瓦片图,导入后要创建 TileSet,然后告诉 Godot:

草地 tile
道路 tile
 tile
 tile
 tile
房子 tile

如果某些 tile 不能走,就给它们设置 collision。

比如:

有碰撞玩家不能走进去
有碰撞
树干有碰撞
草地没有碰撞
道路没有碰撞

3. Marker2D

Marker2D 是一个位置标记节点。

它没有实际显示内容,主要用来标记坐标。

常用场景:

玩家出生点
怪物刷新点
NPC 站立点
传送门目标点
摄像机边界点
子弹发射点
技能生成点

比如:

Map_Forest / Node2D
  ├── SpawnPoints / Node2D
  │   ├── PlayerSpawn / Marker2D
  │   ├── SlimeSpawn01 / Marker2D
  │   └── SlimeSpawn02 / Marker2D

然后代码里可以这样:

player.global_position = $SpawnPoints/PlayerSpawn.global_position

这个节点非常适合做“编辑器里可视化摆点”。

七、显示和绘制相关节点

1. CanvasItem

CanvasItem 是 2D 显示相关节点的基类。

你平时不会直接创建它,但很多节点都继承它:

Node2D
Control
Sprite2D
Label
TextureRect

它提供:

visible
modulate
self_modulate
z_index
show()
hide()

所以你会发现 Sprite2DControl 都有 visible,这是因为它们上层都属于 CanvasItem 系列。

2. CanvasLayer

CanvasLayer 用来创建独立的 2D 绘制层。

最常见用途:UI。

比如:

Main / Node
  ├── World / Node2D
  └── UI / CanvasLayer
      ├── HUD / Control
      └── DialogBox / Control

为什么 UI 要放 CanvasLayer

因为游戏世界会跟着摄像机移动,而 UI 不应该跟着地图移动。

比如玩家走路时:

地图会滚动
玩家位置会变化
血条 UI 应该固定在屏幕上
背包按钮应该固定在右上角
任务栏应该固定在左侧

这些就应该放在 CanvasLayer 下面。

3. Camera2D

Camera2D 是 2D 摄像机。

常用场景:

跟随玩家
限制地图边界
做镜头震动
切换关注目标
剧情镜头移动

典型结构:

Player / CharacterBody2D
  └── Camera2D

或者:

World / Node2D
  ├── Player
  └── Camera2D

如果相机是玩家子节点,它会天然跟随玩家。

如果相机独立放在 World 下面,就更适合做复杂镜头,比如剧情移动、平滑跟随、多目标切换。

RPG 初期建议直接把 Camera2D 放在玩家下面:

Player / CharacterBody2D
  ├── AnimatedSprite2D
  ├── CollisionShape2D
  └── Camera2D

4. ParallaxBackground 和 ParallaxLayer

这两个节点用来做视差背景。

适合:

横版游戏
远景山脉
云层
背景森林
天空层

对于俯视角 RPG 不一定常用。

但如果你做标题界面、远景背景、过场场景,它们会很有用。

八、UI 节点

Godot 的 UI 节点基本都继承自 Control

官方文档说明,Control 是所有 UI 节点的基类,它有矩形区域、锚点、相对父节点或视口的位置偏移,并且会随着父节点或屏幕尺寸变化自动更新。

你可以把 Control 理解成前端里的 div

1. Control

Control 是 UI 根节点常用选择。

比如:

HUD / Control
  ├── HealthBar
  ├── ManaBar
  └── CoinLabel

它本身不一定显示内容,但可以作为 UI 容器。

适合:

HUD 根节点
背包面板根节点
设置面板根节点
对话框根节点
菜单界面根节点

2. Label

Label 用来显示文字。

常用:

角色名字
任务文本
金币数量
提示文字
伤害数字

比如:

CoinLabel / Label

3. RichTextLabel

RichTextLabel 是更强的文字显示节点。

适合:

带颜色的文字
带图标的文字
剧情对话
任务描述
物品说明
滚动文本

比如对话系统:

DialogBox / Control
  ├── SpeakerName / Label
  └── DialogText / RichTextLabel

如果你要做 RPG 对话框,推荐用 RichTextLabel

4. Button

Button 是按钮。

常用:

开始游戏
继续游戏
打开背包
确认
取消
设置
退出

结构:

MainMenu / Control
  ├── StartButton / Button
  ├── LoadButton / Button
  └── QuitButton / Button

按钮通常连接 pressed 信号:

func _on_start_button_pressed():
    get_tree().change_scene_to_file("res://scenes/world/map_forest.tscn")

5. TextureButton

TextureButton 是图片按钮。

适合:

背包图标按钮
技能栏按钮
装备栏按钮
地图按钮
手机游戏虚拟按钮

如果你的按钮是美术图标,而不是普通矩形按钮,用它更合适。

6. TextureRect

TextureRect 用来在 UI 里显示图片。

注意它是 UI 节点,不是世界里的 Sprite。

区别:

Sprite2D放在游戏世界里会受摄像机影响
TextureRect放在 UI固定在屏幕界面上

常用:

头像
物品图标
技能图标
背景面板
菜单图片

比如:

InventorySlot / Control
  ├── Icon / TextureRect
  └── CountLabel / Label

7. ProgressBar

ProgressBar 用来显示进度条。

常用:

血条
蓝条
经验条
加载进度
蓄力条

比如:

HUD / Control
  ├── HealthBar / ProgressBar
  └── ExpBar / ProgressBar

8. TextureProgressBar

TextureProgressBar 是带图片样式的进度条。

适合正式游戏 UI。

比如:

有美术边框的血条
圆形技能冷却
特殊魔法能量条

前期可以先用 ProgressBar,后期换成 TextureProgressBar

9. Panel

Panel 是 UI 面板。

适合:

背包背景
设置窗口
弹窗
任务面板
对话框背景

比如:

InventoryPanel / Panel
  ├── Title / Label
  ├── GridContainer
  └── CloseButton

10. PanelContainer

PanelContainer 是带容器能力的面板。

它通常用于自动布局。

如果你想让一个面板包住里面的内容,用 PanelContainer 很方便。

11. MarginContainer

MarginContainer 用来给子节点加边距。

类似 CSS 里的 padding。

比如:

DialogBox / PanelContainer
  └── MarginContainer
      └── DialogText / RichTextLabel

12. VBoxContainer 和 HBoxContainer

这两个是 UI 自动布局节点。

VBoxContainer 是纵向排列。

VBoxContainer
  ├── Button
  ├── Button
  └── Button

类似:

display: flex;
flex-direction: column;

HBoxContainer 是横向排列。

HBoxContainer
  ├── Icon
  ├── Label
  └── Button

类似:

display: flex;
flex-direction: row;

13. GridContainer

GridContainer 是网格布局。

适合:

背包格子
技能栏
商店商品列表
装备栏
物品仓库

比如背包:

InventoryPanel / Panel
  └── GridContainer
      ├── Slot01
      ├── Slot02
      ├── Slot03
      └── Slot04

14. ScrollContainer

ScrollContainer 用于可滚动区域。

适合:

任务列表
背包列表
设置项很多的页面
图鉴
日志

15. LineEdit

单行输入框。

适合:

输入角色名
输入存档名
搜索物品
聊天输入

16. TextEdit

多行输入框。

游戏里不算常用,但做编辑器工具、开发调试面板时有用。

17. OptionButton

下拉选择框。

适合:

分辨率选择
语言选择
画质选择
难度选择

18. CheckBox

勾选框。

适合:

全屏开关
音乐开关
显示伤害数字
开启自动保存

19. Slider / HSlider / VSlider

滑动条。

常用:

音乐音量
音效音量
亮度
鼠标灵敏度

九、音频节点

1. AudioStreamPlayer

普通音频播放器。

适合播放不依赖空间位置的声音:

背景音乐
UI 点击音
菜单音效
系统提示音

比如:

AudioManager / Node
  ├── BGMPlayer / AudioStreamPlayer
  └── UIPlayer / AudioStreamPlayer

2. AudioStreamPlayer2D

2D 空间音频。

它的位置会影响声音听起来的方向和距离。

适合:

怪物叫声
河流声
火堆声
脚步声
武器碰撞声
远处爆炸声

比如:

Campfire / Node2D
  ├── Sprite2D
  └── AudioStreamPlayer2D

玩家靠近火堆,声音更明显;离远了,声音变小。

3. AudioStreamPlayer3D

3D 游戏使用,2D RPG 基本用不到。

十、计时和异步相关节点

1. Timer

Timer 是定时器节点。

常用场景:

怪物每隔几秒攻击一次
技能冷却
剧情延迟
自动保存
天气切换
日夜循环
生成怪物

比如:

Enemy / CharacterBody2D
  └── AttackTimer / Timer

代码:

func _on_attack_timer_timeout():
    attack()

Timer 很适合做“过一段时间执行”的逻辑。

2. Tween

Godot 4 里更多时候会用代码创建 tween,而不是手动添加 Tween 节点。

Tween 适合做平滑过渡:

UI 淡入淡出
角色受击闪烁
相机平滑移动
物品飞到背包
血条缓慢变化

比如:

var tween := create_tween()
tween.tween_property($Panel, "modulate:a", 0.0, 0.3)

十一、导航寻路节点

1. NavigationRegion2D

NavigationRegion2D 用来定义可寻路区域。

适合:

敌人自动追玩家
NPC 自动走到指定地点
村民巡逻
怪物绕过障碍物

比如:

World / Node2D
  ├── NavigationRegion2D
  ├── Player
  └── Enemy

2. NavigationAgent2D

NavigationAgent2D 通常挂在需要寻路的角色身上。

比如:

Enemy / CharacterBody2D
  ├── Sprite2D
  ├── CollisionShape2D
  └── NavigationAgent2D

它负责帮敌人计算路径。

大概逻辑是:

玩家在哪
敌人设置目标点为玩家位置
NavigationAgent2D 计算下一步方向
敌人移动过去

3. NavigationObstacle2D

用于动态障碍物。

比如:

可移动箱子
临时堵路物
移动 NPC

初期可以不用急着学。

十二、光照和视觉效果节点

1. PointLight2D

2D 点光源。

适合:

火把
灯笼
魔法光球
营火
窗户透出的光

比如:

Torch / Node2D
  ├── Sprite2D
  └── PointLight2D

你的 RPG 如果想做夜晚、洞穴、雾气、神秘森林,PointLight2D 会很有用。

2. DirectionalLight2D

2D 方向光。

适合模拟:

太阳光
月光
整体环境方向光

3. CanvasModulate

CanvasModulate 用来整体改变 2D 世界颜色。

常用来做:

白天
黄昏
夜晚
中毒滤镜
进入梦境
进入黑暗区域

比如夜晚:

World / Node2D
  ├── CanvasModulate
  ├── TileMapLayer
  └── Player

CanvasModulate 调暗后,整个世界都会变暗。

再配合 PointLight2D,就能做火把照亮黑夜的效果。

4. GPUParticles2D

粒子效果节点。

适合:




火花
魔法粒子
落叶
灰尘
攻击特效

比如:

Weather / Node2D
  ├── RainParticles / GPUParticles2D
  ├── SnowParticles / GPUParticles2D
  └── FogParticles / GPUParticles2D

对于你的游戏,之后做天气系统时会经常用到。

5. CPUParticles2D

CPU 粒子。

相比 GPUParticles2D,它更兼容一些老设备,但性能通常不如 GPU 粒子。

一般优先用 GPUParticles2D

十三、资源加载和实例化常用节点思路

这里要特别讲一下:很多时候你不是“创建一个节点”,而是“创建一个场景,然后实例化”。

比如你有:

Slime.tscn
Potion.tscn
DamageNumber.tscn
Fireball.tscn

在代码里:

var slime_scene: PackedScene = preload("res://scenes/enemies/slime.tscn")
var slime = slime_scene.instantiate()
add_child(slime)

这里的 PackedScene 不是节点,而是一个“打包好的场景资源”。

它就像前端里:

组件定义Slime.vue
组件实例页面里真正渲染出来的 Slime

Godot 里:

PackedScene场景模板
instantiate():创建实例
add_child():挂到场景树里

十四、3D 常用节点

虽然你现在主要做 2D RPG,但知道一下 3D 节点也有帮助。

1. Node3D

3D 世界里的基础节点。

类似 2D 的 Node2D

它有:

position
rotation
scale
transform

2. MeshInstance3D

显示 3D 模型。

适合:

角色模型
场景模型
道具模型
建筑模型

3. CharacterBody3D

3D 角色控制。

适合:

第一人称角色
第三人称角色
3D 怪物
3D NPC

4. StaticBody3D

3D 静态碰撞体。

比如:


地面
建筑
山体
不可移动障碍

5. RigidBody3D

3D 物理刚体。

比如:

箱子

物理道具
可被撞飞的物体

6. Area3D

3D 检测区域。

比如:

触发剧情
进入区域
拾取物品
攻击范围

7. Camera3D

3D 摄像机。

8. DirectionalLight3D / OmniLight3D / SpotLight3D

3D 光源。

对应:

DirectionalLight3D太阳光
OmniLight3D点光源
SpotLight3D聚光灯

十五、常见游戏对象应该用什么节点

玩家角色

推荐:

Player / CharacterBody2D
  ├── AnimatedSprite2D
  ├── CollisionShape2D
  ├── AnimationPlayer
  ├── Camera2D
  └── InteractArea / Area2D

作用:

CharacterBody2D控制移动和碰撞
AnimatedSprite2D显示角色动画
CollisionShape2D角色身体碰撞
AnimationPlayer控制复杂动画
Camera2D跟随玩家
Area2D检测可交互物体

敌人

推荐:

Enemy / CharacterBody2D
  ├── AnimatedSprite2D
  ├── CollisionShape2D
  ├── DetectionArea / Area2D
  ├── AttackArea / Area2D
  ├── NavigationAgent2D
  └── AnimationPlayer

作用:

CharacterBody2D敌人移动
DetectionArea发现玩家
AttackArea攻击范围
NavigationAgent2D寻路
AnimationPlayer攻击受击死亡动画

NPC

推荐:

NPC / CharacterBody2D Area2D
  ├── AnimatedSprite2D
  ├── CollisionShape2D
  ├── TalkArea / Area2D
  └── DialogueMarker / Marker2D

如果 NPC 会走动,用 CharacterBody2D
如果 NPC 只是站着不动,也可以用 StaticBody2DArea2D

宝箱

推荐:

Chest / Area2D
  ├── Sprite2D
  ├── CollisionShape2D
  └── AnimationPlayer

作用:

Area2D检测玩家是否靠近
Sprite2D显示宝箱
CollisionShape2D交互范围
AnimationPlayer开箱动画

如果宝箱本身要挡住玩家,可以再加一个 StaticBody2D,或者让宝箱根节点改成 StaticBody2D,旁边挂一个 Area2D 做交互范围:

Chest / StaticBody2D
  ├── Sprite2D
  ├── CollisionShape2D
  ├── InteractArea / Area2D
  │   └── CollisionShape2D
  └── AnimationPlayer

掉落物

推荐:

DropItem / Area2D
  ├── Sprite2D
  └── CollisionShape2D

玩家碰到后拾取。

门和传送点

推荐:

Door / Area2D
  ├── Sprite2D
  └── CollisionShape2D

玩家进入区域后切换地图。

墙、石头、树干

推荐:

StaticBody2D
  ├── Sprite2D
  └── CollisionShape2D

或者直接在 TileSet 里设置 tile 碰撞。

攻击判定

推荐:

AttackHitBox / Area2D
  └── CollisionShape2D

通常攻击判定不是用 CharacterBody2D,而是用 Area2D

比如玩家挥剑时,短暂开启 AttackHitBox

技能子弹

推荐:

Fireball / Area2D
  ├── Sprite2D
  ├── CollisionShape2D
  ├── GPUParticles2D
  └── Timer

作用:

Area2D碰到敌人触发伤害
Sprite2D显示火球
Particles拖尾特效
Timer几秒后自动消失

如果技能需要真实物理反弹,可以用 RigidBody2D,但普通 RPG 技能大多用 Area2D 更好控制。

UI 主界面

推荐:

UI / CanvasLayer
  └── HUD / Control
      ├── HealthBar / ProgressBar
      ├── ManaBar / ProgressBar
      ├── CoinLabel / Label
      └── SkillBar / HBoxContainer

对话框

推荐:

DialogUI / CanvasLayer
  └── DialogBox / Panel
      ├── SpeakerName / Label
      ├── DialogText / RichTextLabel
      └── NextIcon / TextureRect

背包

推荐:

InventoryUI / CanvasLayer
  └── InventoryPanel / Panel
      ├── Title / Label
      ├── GridContainer
      │   ├── Slot01 / TextureButton
      │   ├── Slot02 / TextureButton
      │   └── Slot03 / TextureButton
      └── CloseButton / Button

十六、根节点应该怎么选

这是初学者最容易纠结的地方。

你可以按这个规则选:

不显示、不需要位置,只做逻辑

用:

Node

比如:

GameManager
SaveManager
QuestManager

2D 世界里的普通对象

用:

Node2D

比如:

装饰容器
地图根节点
特效容器

2D 可控制角色

用:

CharacterBody2D

比如:

玩家
敌人
会移动的 NPC

2D 不动的障碍物

用:

StaticBody2D

比如:


石头
树干
房子

2D 受物理影响的物体

用:

RigidBody2D

比如:

被推的箱子
掉落的石块
滚动的木桶

只检测进入、离开、重叠

用:

Area2D

比如:

攻击范围
拾取范围
传送点
对话范围
陷阱区域

UI 根节点

用:

Control

如果要固定在屏幕上,外面再套:

CanvasLayer

十七、Godot 节点选择速查表

需求玩家移动
推荐CharacterBody2D

需求敌人移动
推荐CharacterBody2D

需求地图瓦片
推荐TileMapLayer

需求显示一张图片
推荐Sprite2D

需求播放帧动画
推荐AnimatedSprite2D

需求复杂动画控制
推荐AnimationPlayer

需求攻击范围
推荐Area2D

需求拾取道具
推荐Area2D

需求传送门
推荐Area2D

需求不会动的墙
推荐StaticBody2D

需求会被物理推动的箱子
推荐RigidBody2D

需求角色碰撞框
推荐CollisionShape2D

需求不规则碰撞
推荐CollisionPolygon2D

需求摄像机跟随
推荐Camera2D

需求固定 UI
推荐CanvasLayer + Control

需求血条
推荐ProgressBar TextureProgressBar

需求背包格子
推荐GridContainer + TextureButton

需求文字
推荐Label RichTextLabel

需求音效
推荐AudioStreamPlayer AudioStreamPlayer2D

需求定时执行
推荐Timer

需求生成点
推荐Marker2D

需求粒子特效
推荐GPUParticles2D

需求火把光源
推荐PointLight2D

需求整体变暗夜晚
推荐CanvasModulate

需求敌人寻路
推荐NavigationAgent2D + NavigationRegion2D

十八、以你的 RPG 项目为例,推荐基础场景结构

你的《旧日秘境》这种 2D RPG,基础地图可以这样设计:

Main / Node
  ├── World / Node2D
  │   ├── Map_Forest / Node2D
  │   │   ├── Ground / TileMapLayer
  │   │   ├── Water / TileMapLayer
  │   │   ├── Objects / TileMapLayer
  │   │   ├── AbovePlayer / TileMapLayer
  │   │   ├── SpawnPoints / Node2D
  │   │   │   └── PlayerSpawn / Marker2D
  │   │   └── Interactables / Node2D
  │   │       ├── Chest
  │   │       └── Door
  │   ├── Player / CharacterBody2D
  │   │   ├── AnimatedSprite2D
  │   │   ├── CollisionShape2D
  │   │   ├── InteractArea / Area2D
  │   │   │   └── CollisionShape2D
  │   │   ├── Camera2D
  │   │   └── AnimationPlayer
  │   ├── Enemies / Node2D
  │   └── Items / Node2D
  ├── UI / CanvasLayer
  │   ├── HUD / Control
  │   ├── DialogUI / Control
  │   └── InventoryUI / Control
  ├── GameManager / Node
  ├── AudioManager / Node
  └── SceneManager / Node

这个结构比较适合长期扩展。

以后你要加:

天气系统
昼夜系统
四季系统
战斗系统
任务系统
背包系统
对话系统
怪物系统
地图切换

都可以继续往里面挂,不会一开始就乱成一坨毛线团。

十九、初学者最容易犯的节点选择错误

错误一:玩家用 RigidBody2D

很多人看到“物理身体”就想用 RigidBody2D 做玩家。

但 RPG 玩家应该用:

CharacterBody2D

因为玩家需要精确控制。

RigidBody2D 更适合被物理影响的物体。

错误二:UI 用 Sprite2D

如果是游戏世界里的图片,用 Sprite2D

如果是界面上的图片,用 TextureRect

区别:

Sprite2D在地图里
TextureRect UI

错误三:碰撞节点单独放

CollisionShape2D 不能自己工作。

它必须放在:

CharacterBody2D
StaticBody2D
RigidBody2D
Area2D

下面。

错误结构:

Player / Node2D
  └── CollisionShape2D

这个碰撞不会按你想的方式工作。

正确结构:

Player / CharacterBody2D
  └── CollisionShape2D

错误四:所有东西都放在一个场景里

不要把所有玩家、敌人、地图、UI、背包、对话都堆在一个巨大场景里。

应该拆成:

Player.tscn
Enemy.tscn
Chest.tscn
DialogUI.tscn
InventoryUI.tscn
Map_Forest.tscn
Main.tscn

这样才能维护。

错误五:所有逻辑都写在 Player.gd

玩家移动可以在 Player。

但这些不应该都写在 Player:

背包系统
任务系统
存档系统
天气系统
地图切换系统
音频系统

这些应该拆成独立管理节点或 Autoload。

二十、节点学习顺序建议

你不用一开始把所有节点都学完。

建议按这个顺序:

第一阶段:会搭 2D 场景

先学:

Node
Node2D
Sprite2D
AnimatedSprite2D
CharacterBody2D
CollisionShape2D
Camera2D
TileMapLayer

目标:

能做一个地图
角色能显示
角色能移动
角色不能穿墙
摄像机能跟随

第二阶段:会交互

再学:

Area2D
Timer
Marker2D
AnimationPlayer
AudioStreamPlayer2D

目标:

能开宝箱
能和 NPC 对话
能传送地图
能播放动画
能播放音效

第三阶段:会做 UI

再学:

CanvasLayer
Control
Label
RichTextLabel
Button
TextureRect
ProgressBar
Panel
GridContainer
HBoxContainer
VBoxContainer

目标:

血条
金币
对话框
背包
菜单
设置界面

第四阶段:会做游戏系统

再学:

NavigationAgent2D
NavigationRegion2D
GPUParticles2D
PointLight2D
CanvasModulate
Resource
PackedScene
Autoload

目标:

敌人寻路
天气
昼夜
技能
怪物刷新
任务系统
背包数据
存档

二十一、总结

Godot 的节点并不是孤立使用的,而是通过“组合”来形成一个游戏对象。

你不应该问:

我要用哪个节点做玩家

而应该问:

玩家这个对象需要哪些能力

然后拆开:

需要移动和碰撞CharacterBody2D
需要显示图片AnimatedSprite2D
需要碰撞形状CollisionShape2D
需要相机跟随Camera2D
需要动画控制AnimationPlayer
需要交互范围Area2D

所以最终玩家不是一个节点,而是一组节点:

Player / CharacterBody2D
  ├── AnimatedSprite2D
  ├── CollisionShape2D
  ├── Camera2D
  ├── AnimationPlayer
  └── InteractArea / Area2D

这就是 Godot 的核心思想:

一个节点负责一种能力
多个节点组合成一个对象
多个对象组合成一个场景
多个场景组合成一个游戏

你只要理解了这个,Godot 就不会再像一堆陌生按钮,而会更像你熟悉的前端组件树。只是这次组件不是渲染网页,而是在组织一个真正能动、能碰撞、能交互的游戏世界。

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
godot2026-07-27
Godot 4 常用 UI 节点详解
Godot 4 常用 UI 节点详解 在 Godot 4 中,UI 系统基于 Control(控件) 节点构建。所有 UI 节点都继承自 Control,形成一棵完整的 UI 树。与游戏引擎中常见的"Canvas + DOM"模式不同,Godot 的 UI 系统是声明式的——你在场景中搭好节点树,引擎自动完成布局计算。 一、布局系统:Container 家族 Container 是 Godot UI 的 骨架 。它决定了子节点的大小和位...
学习
godot2026-07-09
Godot 4 自动地形系统(AutoTileSet / Terrains)完全指南
前言 在 2D 游戏开发中,地形瓦片(tile)的拼接是一个绕不开的问题。想象一下:你有一片草地、一条河流、一段平台——如果每一块边缘、角落、过渡区域都要手动选择对应的瓦片图,工作量将是巨大的。 自动地形系统 就是为了解决这个问题而生的。 一、什么是自动地形(Autotiling)? 自动地形的核心思想很简单: 你只管画,引擎帮你选对瓦片 。 当你在 TileMap 上绘制地形时,引擎会自动检测每个瓦片的上下左右邻居,然后根据预设的规则...
学习
godot2026-06-25
Godot 中 zindex 和 ysort 的区别总结
在 Godot 2D 游戏开发中,角色、树木、怪物、地面、技能特效、UI 都需要正确的显示顺序。比如角色走到树前面时,角色应该挡住树;角色走到树后面时,树又应该挡住角色。 这种显示顺序主要和两个概念有关: 和 。 其中 用来手动控制图层顺序, 用来根据物体的 Y 坐标自动排序。 一句话理解 是手动分层。 是根据 Y 坐标自动排序。 简单来说: | 属性 | 作用 | 适合场景 | | | | | | | 数值越大,显示越靠前 | 地面、...
学习
godot2026-06-11
Tileset 资源图的标准和规范
一、什么是 Tileset 资源图 Tileset,中文通常叫“图块资源图”或“瓦片图”,是 2D 游戏中非常常见的一种地图资源组织方式。 简单来说,Tileset 就是把很多小图块按照固定尺寸排列在一张图片里。游戏引擎会按照固定的格子大小去切割这张图片,然后把每个小格子当成一个独立的地图块使用。 比如一个 32×32 像素的 Tileset 中,每一个 tile 都是 32×32 像素。地图编辑器或游戏引擎会按照 32×32 的网格,...
学习
godot2026-05-29
用户角色精灵图制作角色的完整流程
在 2D RPG 游戏里,角色通常不是用一张单独图片完成的,而是用一张“角色精灵图”来做。 所谓角色精灵图,通常是一张包含多个动作帧的大图。比如角色向下走有 4 帧,向左走有 4 帧,向右走有 4 帧,向上走有 4 帧。Godot 会根据这些帧不断切换图片,看起来角色就动起来了。 这篇文章主要介绍:拿到一张角色精灵图之后,如何在 Godot 中把它做成一个可以正常移动、播放动画、和地图产生遮挡关系的角色。 一、先理解角色精灵图是什么 角...
学习
godot2026-05-19
第一部分 01:Godot 基础世界观
先建立一个总认知: Godot 做游戏的核心思路是:用一个个 Node 组成 Scene,再把 Scene 放进 SceneTree 运行。代码 Script 负责控制 Node,Resource 负责存数据,Signal 负责对象之间通信。 你可以先把 Godot 想成一个“可视化的前端工程”: | Godot | 前端类比 | 说明 | | | | | | Project | 一个前端项目仓库 | 整个游戏工程 | | Scene...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录