代码之家  ›  专栏  ›  技术社区  ›  DanielRead

戈多正在收听来自同一场景多个实例的信号

  •  1
  • DanielRead  · 技术社区  · 3 年前

    我有以下场景: 玩家 敌人

    当攻击与敌人相撞时,敌人会发出“击中”信号。

    如果我在多个场景中都听到了敌人的信号,那么我该怎么做呢?有没有办法抓取场景的所有实例并连接到它们的所有信号?有没有更好的方法将此消息发送回玩家?

    我是戈多的新手,所以任何建议都非常有用!谢谢

    1 回复  |  直到 3 年前
        1
  •  2
  •   Theraot    3 年前

    使用信号总线。

    是的,您可以迭代节点并找到所有敌人(例如,通过比较他们的脚本)。但是,如果所有的敌人都注册到一个列表(或一个组)上,这就容易多了 _ready . 然而,你不需要这些。

    洞察是这样的:一个对象可以发射其他对象的信号。

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

    • autoload (singleton) 剧本 SignalBus .

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

      signal on_hit
      
    • 每个需要发出信号的地方都通过信号总线发出信号。

      SignalBus.emit_signal("on_hit")
      
    • 在需要处理信号的地方,连接到它。例如 _准备好了吗 . 大概是这样的:

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

    每个接收器不需要知道其他接收器的方式。他们只需要知道信号总线。这是无处不在的(由于是自动加载)。