【发布时间】:2021-08-06 10:00:52
【问题描述】:
我有以下场景: 播放器 敌人 攻击
当攻击与敌人发生碰撞时,敌人会发出“onHit”信号。
播放器侦听该信号并反弹回来。
这一切都很好,但是现在如果我复制敌人所以有多个敌人场景,我如何听所有这些场景的信号?有没有办法抓取场景的所有实例并连接到它们的所有信号?有没有更好的方法将此消息发送回播放器?
我对 Godot 很陌生,所以任何建议都非常有帮助!谢谢。
【问题讨论】:
标签: godot
我有以下场景: 播放器 敌人 攻击
当攻击与敌人发生碰撞时,敌人会发出“onHit”信号。
播放器侦听该信号并反弹回来。
这一切都很好,但是现在如果我复制敌人所以有多个敌人场景,我如何听所有这些场景的信号?有没有办法抓取场景的所有实例并连接到它们的所有信号?有没有更好的方法将此消息发送回播放器?
我对 Godot 很陌生,所以任何建议都非常有帮助!谢谢。
【问题讨论】:
标签: 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
这样,信号的发射器和接收器就不需要相互了解了。他们只需要知道信号总线。随处可用(由于是自动加载)。
【讨论】: