是否可以创建一个按钮工厂,其中按钮按下时会发出信号?

Is it possible to create a button factory with buttons these emit signal by pressed?

我想创建一个按钮工厂,通过特定配置作为参数来创建按钮。如果按下,按钮必须发出信号。我找不到任何以编程方式添加该功能的方法。 我知道,我可以通过编辑器添加按钮并通过脚本向其中添加该功能。但是有了工厂,我不需要自己添加每个按钮。

非常感谢!

Buttons emit a signal when they are pressed, it is called "pressed"。这不是您需要添加的功能。

也许您需要的是别的东西? Godot 编辑器与您的游戏建立在相同的 API 之上,因此您几乎可以从代码中完成编辑器可以做的任何事情……例如……


您可以从代码添加脚本

如果您需要添加信号,通常的方法是附加一个脚本,其中包含声明的信号和发出信号的逻辑。

如果你创建了这样的脚本,你可以load or preload it in your code, and then attach the script to the Object you want (with set_script). There is also a get_script method to retrieve it. And a "script_changed".

是的,您也可以从代码创建脚本。创建一个GDScript object, set its source_code, and reload吧。然后你可以将它附加到 Object 就像你已经加载它一样。

顺便说一下,脚本是 Resource,这就是为什么您可以 loadpreload 的原因。另见 ResourceLoader. It also means that you can save it with ResourceSaver. However, I remind that resource paths 并不总是可写的。


您可以从代码中添加信号

是的,您可以从代码中动态添加信号。 我的意思是未在脚本中声明的自定义信号,可以随时添加。为此,如果您不关心它是否已添加,请调用 add_user_signal on the Object. You can check with has_user_signal (use has_signal添加或不添加 add_user_signal)。不,没有针对这些的删除方法。因此,请谨慎使用它们。

顺便说一句,你可以获得一个Array of all signals on an object with get_signal_list


您可以从代码发出信号

你这样做你可以调用 emit_signal

你也可以在其他对象上调用它(我的意思是,你不必从附加到具有信号的 Object 的脚本中调用 emit_signal,它可以来自一个不同的)。


您可以通过代码管理连接

我还提醒您,您可以将信号连接到 connect method. See also disconnect and is_connected

哦,而且可以用get_incoming_connections and get_signal_connection_list (Here is an example查询连接,也演示了get_signal_list)。不,您无需担心释放对象时断开信号。 Godot 负责这件事。


你也可以屏蔽信号

您可以使用 set_block_signals, and check with is_blocking_signals 让对象阻止其信号。 我 - 就个人而言 - 没有使用过这个,从来没有必要。我只是为了完整起见才提到它。