【问题标题】:Godot listening to signals from multiple instances of the same sceneGodot 监听来自同一场景的多个实例的信号
【发布时间】:2021-08-06 10:00:52
【问题描述】:

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

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

播放器侦听该信号并反弹回来。

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

我对 Godot 很陌生,所以任何建议都非常有帮助!谢谢。

【问题讨论】:

    标签: godot


    【解决方案1】:

    使用信号总线。

    是的,您可以遍历节点并找到所有敌人(例如,通过比较他们的脚本)。但是,如果所有敌人都将自己注册到_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
      

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

    【讨论】:

    • 这个解决方案效果很好!非常感谢您花时间解释它!
    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多