我有以下场景:
玩家
敌人
攻击
当攻击与敌人发生碰撞时,敌人会发出“onHit”信号。
播放器监听该信号并反弹。
这一切都运行良好,但现在如果我复制敌人,因此有多个敌人场景,我如何收听所有敌人的信号?有没有办法获取场景的所有实例并连接到它们的所有信号?有没有更好的方法将此消息发送回玩家?
我对戈多很陌生,所以任何建议都非常有帮助!谢谢。
使用信号总线。
是的,您可以迭代节点并找到所有敌人(例如通过比较他们的脚本)。然而,如果所有的敌人都将自己注册到一个列表(或一个组)中,那就更容易了_ready
。但是,您不需要这些。
见解是这样的:一个物体可以发出其他物体的信号。
我们通过创建信号总线来利用这一点。这是 Godot 中的常见模式。其过程如下:
-
创建一个自动加载(单例) https://docs.godotengine.org/en/stable/getting_started/step_by_step/singletons_autoload.html脚本。让我们称之为SignalBus
.
-
在脚本中,定义信号。没有别的。 *在我们的例子中,我们定义on_hit
:
signal on_hit
-
每个需要发出信号的地方都是通过信号总线来实现的。在这种情况下,敌人会这样做:
戈多 3 或 戈多 4
SignalBus.emit_signal("on_hit")
或者使用新的 Godot 4 语法:
SignalBus.on_hit.emit()
-
在需要处理信号的地方,连接到它。例如关于_ready
. 像这样的事情:
Godot 3
func _ready() -> void:
SignalBus.connect("on_hit", self, "_on_hit")
func _on_hit() -> void:
# whatever
pass
Godot 4 遗留语法(此语法简化了代码升级)
func _ready() -> void:
SignalBus.connect("on_hit", Callable(self, "_on_hit"))
func _on_hit() -> void:
# whatever
pass
在 Godot 4 中,我们可以简单地将方法引用作为Callable
:
func _ready() -> void:
SignalBus.connect("on_hit", _on_hit)
func _on_hit() -> void:
# whatever
pass
或者使用新的 Godot 4 语法:
func _ready() -> void:
SignalBus.on_hit.connect(_on_hit)
func _on_hit() -> void:
# whatever
pass
这样,信号的发射器和接收器不需要彼此了解。他们只需要知道信号总线。它随处可用(由于是自动加载)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)