【学习笔记】agm的信号发送与接收功能与gds脚本联动,以按钮功能为例

这几天在观看godot与agm的调用手册以及论坛里的分享,总结一些使用的经验,作为学习的笔记整理,分享归档给朋友们

在agm中,在GameObject的动作里创建发送信号,在对应的对象上就会出现对应的信号。


image

其作用可直接作为一个方法使用在gds的脚本中,将其实例化置于场景之中,双击选择对应创建的脚本会生成对应方法,此时添加一个控制台打印命令,测试一下运行,打印正常,说明脚本接收到了信号。


接下来创建信号使脚本接收,首先需要创建信号,在脚本编辑器中输入

#调用agm的信号函数
signal agm_send_signal(signal_name,parameter)
#此处GameObject=后面需要跟着所需要发送信号对象的路径,如果该脚本置于目标对象的子对象下的话,则使用$"..",如果非子对象,则需要指定GameObject的路径
@onready var player: GameObject =$"SceneLayer/BaseLayer/ObjectRoot/切换场景对象"
#新建一个信号名称,这个语句可以使你在右侧菜单栏里随时修改信号名称用于测试
@export var SignalName = ""
![image|472x84](upload://23LYxeu8XVOTqHi1XObOCzTW2Xa.png)

#一般这个_ready函数在你创建gds脚本时已经给你创建好,只需填写代码块内的内容
func _ready() -> void:
#建立信号与函数之间的连接
	agm_send_signal.connect(Callable(player,"receive_signal"))
	pass # Replace with function body.
#发送信号
#一般这个_process函数在你创建gds脚本时已经给你创建好,只需填写代码块内的内容
func _process(delta: float) -> void:
	agm_send_signal.emit(SignalName,null)
	pass

完整脚本:

signal agm_send_signal(signal_name,parameter)
@onready var player: GameObject = $"SceneLayer/BaseLayer/ObjectRoot/切换场景对象"
@export var SignalName = ""

func _ready() -> void:
	agm_send_signal.connect(Callable(player,"receive_signal"))
	pass # Replace with function body.

func _process(delta: float) -> void:
	agm_send_signal.emit(SignalName,null)
	pass

这里我们给动作创建一个控制台打印“游戏开始”,并且条件设置为接收到"GameStart"函数,观察打印结果。




image
成功打印

这里已经学会了如何接收和发送信号,尝试一下如何使用这些信号,以按钮为例。
在GameScene下新建一个Node,将刚刚的代码剪切复制复制到这里来,这里我主要使用了一个创建按钮的方法,用于测试该信号功能传递



点击按钮尝试,成功打印出结果(这里我试了一下不知为何脚本在父节点无法调用,只有在子节点才能调用,希望有godot大神能出手指正有何错误)

接下来尝试场景切换,这里我已经建立好了另外一个场景,于是连线添加条件


添加动作结束上一个场景进行测试

点击按钮尝试切换


切换成功

笔者测试至此,以agm发送与接收信号的功能,测试按钮组件与场景切换功能的联动,笔者还在学习编程语言中,大部分为从官方文档以及论坛教程整理而来,如果有做的不够好的请见谅,也欢迎指正补充,一同学习探讨

「いいね!」 2

支持分享!可以考虑将代码部分用代码框包围,保持缩进更容易阅读。

「いいね!」 1

谢谢,论坛使用的功能不是很熟练,这边后续看下如何使用这个块引用。

用独占一行的```符号,在开头结尾两行包裹代码块即可。

原来是这样,谢谢。