【问题标题】:Connecting signals without node and through node of a child - Godot连接没有节点和通过子节点的信号 - Godot
【发布时间】:2020-01-04 22:24:08
【问题描述】:

到目前为止我一直在尝试做的事情 -

我有一个名为 recipes 的类 Singleton 脚本。我有一个信号launched。我有 recipe 类的对象。其中一个对象是noodles。我想将信号launched 连接到面条中名为after_launch 的函数。我不确定将信号连接到哪个节点。我正在使用一个类,因为我有多个recipes,每个都有自己的launched 信号。

我还想知道如何在单例脚本中将信号连接到函数 - 根本没有节点。

我一直在使用的代码 -

connect("launched", self, "launched_noodle")

我明白使用“连接”而不使用它前面的节点会产生错误。 错误 -

error(3,1) 意外的令牌标识符:连接

我该怎么做 -

1) 将其连接到编写代码的节点 - w.r.t recipesnoodles。您通常将信号连接到哪些节点?

2) 当我只想将其连接到单例脚本时进行连接。

我尝试用谷歌搜索这个问题,并遇到了this question on Godot Forum 的类似问题。我不明白完整的问题或答案。也许可能对您有所帮助。

附加信息 -

我班的代码(单例)recipe

extends Node2D
class_name recipe
signal launched

noodles和其他孩子的代码-

extends recipe
connect("launched", self, "launched_noodle")

代码流程-

用户触发cooking station 并且cooking station 节点在屏幕上打开。

然后,检查用户的等级和其他参数,并在屏幕上显示适当的recipe。这个recipe 是一个已定义的class - 一个Godot Singleton - 并且在cooking station 下有许多物理节点链接

一旦合适的节点被定位并显示在屏幕上,我想要启动的signal 应该由cooking station 发出。这个signal - 根据它发出的节点,在屏幕上进行某些更改。那是通过一个名为launched_recipename的函数

【问题讨论】:

  • “我有一个名为 recipes 的类 Singleton 脚本”...“我有多个食谱”。这些说法似乎自相矛盾。根据定义,单例具有一个实例。另外,请分享您的完整代码。该错误听起来像是语法错误。
  • 嗨。我的 Singleton 是一个班级,它有很多孩子。我已按要求添加了附加代码。
  • 扩展一个单例类来创建非单例节点对我来说是一个非常奇怪的模式。你能后退一步,解释一下你在高层次上真正想要完成的事情吗?
  • 我正在尝试创建一个系统,其中有一个具有多个食谱节点的烹饪站。所有这些都是隐藏的,与玩家级别和某些其他参数相匹配的会显示在屏幕上。所有配方都有标准功能——所以我创建了一个所有节点都可以访问的类——因此在一个单例脚本中。我将该类扩展到屏幕中的所有节点,因为所有节点的变量值都不同,即使变量名称相同。同样,我也想要一个对所有节点都通用的信号,所以我试图把它放在类中。
  • 当您说Singleton 时,您是指Godot Singleton,即Autoload 节点吗?

标签: class nodes godot gdscript


【解决方案1】:

出现错误Unexpected token Identifier:connect是因为connect是一个函数,所以需要在另一个函数的范围内调用它,比如_ready。根据您描述的流程,听起来launched 应该是烹饪台 中定义的信号,而不是recipe,所以您可能会有这样的情况:

  • CookingStation(定义信号launched
    • 面条(定义函数_on_launched

Noodles.gd:

extends Recipe

func _on_launched():
    print("Noodles was launched")

func _ready():
    var cooking_station = get_parent()
    cooking_station.connect("launched", self, "_on_launched")  

这里真的不需要单例。如果你认为你需要一个 Singleton 以便 Noodles 可以从 Recipe 继承,那就没有必要了。只需添加 class_name Recipe 指令即可将 Recipe 置于全局范围内,以便其他脚本可以继承它。

【讨论】:

  • 嗨,这似乎有效 - 但现在我需要为每种类型的食谱制作单独的信号。有没有一种方法可以让我只制作一个并使其适用于所有人?
  • 我仍然不确定我是否理解,但也许你想要一个参数化的信号? signal launched(recipe_name), emit_signal("launched", "noodles")?
  • 是的,实际上参数化信号可能会解决我的问题——现在我想到了。谢谢,我会研究带参数的信号。
猜你喜欢
  • 2018-10-12
  • 1970-01-01
  • 2020-03-25
  • 2021-08-22
  • 2023-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
相关资源
最近更新 更多