节点之间的通信:信号(Signals)
1. 什么是信号(Signal)?
信号就是一种消息通知机制, 允许一个节点在发生某些事情时,通知其他节点。
✅ 信号是松耦合的,发送者不需要知道接收者是谁,只负责广播。
🧱 理解比喻
想象:
- 一个按钮节点就像一个广播站。
- 当按钮被按下时,它发出广播:「我被按了!」
- 其他节点(比如玩家角色)只要订阅了这个广播,就能立刻收到通知,并采取行动(比如跳起来)。
2. 为什么需要信号?
-
传统直接调用函数:
- A节点必须知道B节点存在 ➔ 紧耦合 ➔ 扩展困难
使用信号:
- A节点只发广播,不管有没有人接收 ➔ 松耦合 ➔ 结构清晰、维护容易
✅ 比如:玩家靠近门口,Area2D只需要广播「有人进来了」,不用关心是谁接收。
3. Godot 信号的使用步骤
步骤 | 动作 | 示例 |
---|---|---|
1 | 定义信号(可选) | signal health_depleted |
2 | 发送信号 | EmitSignal("health_depleted") |
3 | 连接信号 | 在编辑器或代码里连接到其他节点的方法 |
4 | 响应信号 | 被连接的方法自动执行 |
4. 最常用的内置信号
Godot自带很多节点的内置信号,比如:
节点类型 | 信号 | 含义 |
---|---|---|
Button | pressed() | 按钮被点击 |
Area2D | body_entered | 有物体进入检测区域 |
Timer | timeout() | 定时器时间到 |
5. 信号实际例子(结合Godot界面)
为了更好理解,我们用一个最常见的实际场景:
【例子:玩家点击按钮后,让角色跳跃】
📌 第一步:搭建场景(含角色内部结构)
- 创建一个新场景,根节点是
Node2D
,命名为MainScene
。 - 添加两个子节点:
- 一个
Button
节点,命名为JumpButton
- 一个
CharacterBody2D
节点,命名为Player
- 一个
- 继续给 Player 添加两个子节点:
Sprite2D
➔ 显示角色的图像CollisionShape2D
➔ 定义角色的碰撞边界
最终的场景树结构如下:
MainScene (Node2D)
├── JumpButton (Button)
└── Player (CharacterBody2D)
├── Sprite2D
└── CollisionShape2D
🔍 解释:
- Sprite2D:
- 用来展示角色图像(贴图)
- 需要在右侧
Texture
属性里加载一张角色 PNG 图片(这里我们拖动icon.svg到Texture)
- CollisionShape2D:
- 必须添加一个形状(例如
RectangleShape2D
,形状应贴合角色,大小一般是比我们角色小一点) - 没有这个,角色无法与地面碰撞,
MoveAndSlide()
也不会生效 - (其实有没有CollisionShape2D无所谓,因为我们这次demo不牵扯碰撞🤣,我写的原因是正常项目还是会牵扯到碰撞,当学习了
- 必须添加一个形状(例如
✅ 所以 Player 需要这两个子节点才能“看得见 + 碰得到 + 跳得起”。