戈多信号&已发出&q;,但未收到&q; [英] Godot Signal "Emitted" but not "Received"

查看:13
本文介绍了戈多信号&已发出&q;,但未收到&q;的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试以这种方式从单例脚本发送信号:

if(Input.is_action_just_pressed("ui_select")):
    emit_signal("update_inventory")
    #More Code underneath - 

我已经在显示库存物品的UI元素上声明了信号。像这样-

signal update_inventory

和通过编辑器连接到它的函数的声明-

func _on_Inventory_update_inventory():
    #My code here

我试图理解一个类似的问题(我想是的?)here。我不能完全理解它。我看到有人在里面说-信号是物体的局部信号。真的吗?如果是,为什么不正常调用该函数呢?信号的意义就会落空,不是吗?

我还需要一个解决信号问题的方法。也许我没有正确配置它。我哪里出错了?

如果需要,我非常乐意提供更多信息。

推荐答案

信号是对象的本地信号。真的吗?

是的。如果在节点A中定义信号,则该信号必须从节点A发出。通常,您会从A本身调用emit_signal,因为信号是Node通知其他人发生了有趣事情的一种方式。

如果由于某种原因确实要从另一个Node发出信号,则需要以某种方式获取对包含该信号的Node的引用:

$Path/To/A.emit_signal("something_happened")

这是件好事,因为如果信号总是全局的,它们就不会那么有用了。考虑一下Button.pressed信号。在有许多按钮的场景中,我们必须具体说明按下的是哪个按钮。是"开始游戏"按钮,还是"退出游戏"按钮?仅从此场景中任何节点调用emit_signal("pressed")的功能将不明确。

但是,有些信号可能本质上是"全局"的,如game_over。为此,您可以使用"Event Bus"。听起来您可能正在尝试这样做,但您应该在单例中定义您的信号,如下所示:

# Events.gd (singleton)
signal game_started
signal game_over
然后,各个节点可以选择从树中的任何位置侦听或发出这些信号。例如:

Events.emit_signal("game_started")

# in another node:
Events.connect("game_started", self, "start_music")

这通常称为publish-subscribe模式。

为什么不正常调用该函数?

调用函数通常要求"发送"节点对"接收"节点有特定的了解,这会增加节点之间的coupling。耦合越紧,灵活性越低,游戏开发速度越慢!

考虑我们的UI示例。如果按钮负责在单击时直接调用操作,则每个按钮都需要自定义代码来调用特定操作。我们会有start_button.gdquit_button.gd等等。

通过使用信号,我们只需要一个Button脚本(实际上是built into Godot!)。此按钮只负责在单击时发出信号,然后我们可以将该信号连接到任何任意操作。

在使用信号思考时,您可以定义不了解外部世界的小型独立节点。这样的节点可以放置在场景树中的任何位置,并根据需要连接起来,使您可以快速构建场景!

我还需要解决信号问题的方法

我希望在阅读本文后,您会发现信号不是需要解决的问题。耦合是问题,信号是解决问题的工具。

这篇关于戈多信号&已发出&q;,但未收到&q;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆