Godot 监听来自同一场景的多个实例的信号

Godot listening to signals from multiple instances of the same scene

我有以下场景: 播放器 敌人 攻击

当攻击与敌人发生碰撞时,敌人会发出“onHit”信号。

播放器监听该信号并弹回。

这一切都很好,但现在如果我复制敌人所以有多个 Enemy 场景,我该如何收听所有这些场景的信号?有没有办法获取场景的所有实例并连接到它们的所有信号?有没有更好的方法将此消息发送回播放器?

我是 Godot 的新手,所以任何建议都非常有帮助!谢谢。

使用信号总线。

是的,您可以遍历节点并找到所有敌人(例如通过比较他们的脚本)。但是,如果所有敌人都将自己注册到 _ready 上的列表(或组)中,会更容易。但是,您不需要这些。

洞察力是这样的:一个物体可以发出其他物体的信号。

我们通过创建信号总线来利用这一点。这是 Godot 中的常见模式。内容如下:

  • 创建一个 autoload (singleton) 脚本。 姑且称它为SignalBus.

  • 在脚本中,定义信号。没有别的。 *在我们的例子中,我们定义 on_hit:

    signal on_hit
    
  • 每个需要发出信号的地方都从信号总线发出。 在这种情况下,敌人会这样做:

    SignalBus.emit_signal("on_hit")
    
  • 在需要处理信号的地方,连接到它。例如 _ready像这样:

    func _ready() -> void:
        SignalBus.connect("on_hit", self, "_on_hit")
    
    func _on_hit() -> void:
        # whatever
        pass
    

这样一来,信号的发射器和接收器就不需要相互了解了。他们只需要知道信号总线。随处可用(由于是自动加载)。