Man*_*ana 0 signals gdscript godot
我一直在尝试以这种方式从单例脚本发送信号:
if(Input.is_action_just_pressed("ui_select")):
emit_signal("update_inventory")
#More Code underneath -
Run Code Online (Sandbox Code Playgroud)
我已经在显示我的库存项目的 UI 元素上声明了信号。像这样 -
signal update_inventory
Run Code Online (Sandbox Code Playgroud)
以及通过编辑器连接到它的函数的声明 -
func _on_Inventory_update_inventory():
#My code here
Run Code Online (Sandbox Code Playgroud)
我试图理解一个类似的问题(我认为是这样?) 这里。我完全无法理解。我看到有人在里面说 - 信号是对象本地的。他们,真的吗?如果是,为什么不正常调用该函数?信号点会被打败,不是吗?
我也需要一种方法来解决信号问题。也许我没有正确配置它。我哪里错了?
如果需要,我非常乐意提供更多信息。
信号是对象的局部信号。他们,真的吗?
是的。如果在 node 中定义信号A,则该信号必须从 node 发出A。通常,您会emit_signal从A自身调用,因为信号是一种Node通知其他人发生了有趣的事情的方式。
如果出于某种原因,您确实想从 another 发出信号Node,则需要以Node某种方式获取对包含该信号的引用:
$Path/To/A.emit_signal("something_happened")
Run Code Online (Sandbox Code Playgroud)
这是一件好事,好像信号总是全球性的,它们几乎没有那么有用。考虑Button.pressed信号。在有许多按钮的场景中,我们必须具体说明按下了哪个按钮。是“开始游戏”按钮还是“退出游戏”按钮?emit_signal("pressed")从这个场景中的任何节点调用的能力是不明确的。
但是,某些信号本质上可能是“全局的”,例如game_over. 为此,您可以使用“事件总线”。这听起来像你可能会试图做到这一点,但你应该定义你的边界处理中的单身,就像这样:
# Events.gd (singleton)
signal game_started
signal game_over
Run Code Online (Sandbox Code Playgroud)
然后各个节点可以选择从树中的任何位置侦听或发出这些信号。例如:
Events.emit_signal("game_started")
# in another node:
Events.connect("game_started", self, "start_music")
Run Code Online (Sandbox Code Playgroud)
这通常称为发布-订阅模式。
为什么不正常调用函数?
调用函数通常需要“发送”节点具有“接收”节点的特定知识,这增加了节点之间的耦合。更紧密的耦合意味着更小的灵活性,这意味着更慢的游戏开发!
考虑我们的 UI 示例。如果按钮负责在单击时直接调用操作,则每个按钮都需要自定义代码来调用特定操作。我们会有start_button.gd, quit_button.gd, 等等。
通过使用信号,我们只需要一个Button脚本(实际上是 Godot内置的!)。这个按钮只负责在点击时发出一个信号,然后我们可以连接到任何任意动作。
在考虑信号时,您可以在不了解外部世界的情况下定义小的、自包含的节点。此类节点可以放置在场景树中的任何位置并根据需要进行连接,让您可以快速构建场景!
我也需要一种方法来解决信号问题
我希望在阅读本文后您会发现信号不是需要解决的问题。耦合是问题,信号是解决问题的工具。
| 归档时间: |
|
| 查看次数: |
2402 次 |
| 最近记录: |