Godot信号教程(使用C#语言)| 创建自定义信号 | 发出自定义信号 | 使用代码监听信号

news2024/11/27 10:36:01

文章目录

  • 信号是什么
  • 连接信号
    • 使用编辑器连接信号
    • 使用代码连接信号
      • Lambda
  • 自定义信号
    • 声明信号
    • 发射信号
    • 带参数的信号
  • 其他文章

信号是什么

在Godot游戏引擎中,信号是一种用于对象之间通信的重要机制。它允许一个对象发出信号,而其他对象可以连接到这个信号并执行相应的操作。这样可以轻松实现解耦和灵活的对象通信。

连接信号

使用编辑器连接信号

在Godot编辑器中,可以通过节点面板来连接信号,具体步骤如下。
在编辑器中选择发送信号的节点。在节点属性面板中,找到发送信号的信号名称,点击右下角的“连接…”按钮。
在这里插入图片描述
在连接对话框中选择要接收信号的节点和设定接收方法的方法名。编辑器会自动生成回调方法的命名,一般为"_on_节点名_信号名"。如果使用C#,编辑器不会自动生成该方法,需要手动编写回调方法。完成后点击“连接”按钮完成信号连接,如下图所示。
这种方法是在编辑器中完成信号连接,并且可以通过可视化界面直观地完成。
在这里插入图片描述
注意,你在程序中的接收方法,方法名要与编辑器中设置的方法名完全一致,即上图中画红色方框的区域。

使用代码连接信号

在对象脚本中,我们可以使用代码连接到一个信号并实现相应的操作。

public override void _Ready()
{
	// 连接到信号
    var timer= GetNode<Timer>("Timer");
    timer.Timeout += OnTimerTimeout;
}
private void OnTimerTimeout()
{
}

当Timer对象发出Timeout信号时,该脚本挂载的对象会接收到信号并调用OnTimerTimeout()方法来执行相关操作。
这种方法通过代码进行信号连接,可以更加灵活地处理信号并进行相应的逻辑操作。

Lambda

连接信号时,我们还可以使用Lambda表达式来处理信号,使代码更加简洁和易读。下面我们就用一个具体的例子来学习一下。
首先创建一个Timer节点。并将其Autostart启动。
在这里插入图片描述

然后我们编写如下脚本:

using Godot;

public partial class LearnCSDN : Node2D
{
	private Timer timer;
	// Called when the node enters the scene tree for the first time.
	public override void _Ready()
	{
		timer = GetNode<Timer>("Timer");
        timer.Timeout+=() =>
        {
			GD.Print("Timeout");
            // 当计时器发出 "timeout" 信号时,会执行这个Lambda表达式
            // 在这里编写处理代码
        };
	}
}

在上面的代码中,我们在_Ready方法获取了场景中名为"Timer"的子节点,并将其赋值给timer成员变量。

然后,我们使用+=操作符与Lambda表达式将计时器的Timeout事件与一个匿名方法绑定在一起。在这个匿名方法中,我们使用GD.Print打印了"Timeout"信息,表示计时器超时时会执行这段代码。
现在运行场景,会发现每过一秒我们的输出窗口都会有Timeout的消息传出,如下图所示。
在这里插入图片描述

自定义信号

声明信号

我们可以自定义信号,而不是使用Godot内置的信号,使用自定义的信号要在脚本的类中编写,可以在类的成员变量区域使用signal特性来声明信号。在声明信号时,需要注意信号命名的要求,结尾需要以EventHandler为后缀。代码如下所示。

using Godot;

public partial class LearnCSDN : Node2D
{
	// 声明信号
	[Signal]
	public delegate void HealthDepletedEventHandler();
}

通过上述代码,我们声明了一个名为"HealthDepleted"的信号。

注意,信号名的末尾必须以"EventHandler"结尾。这是一种命名约定,有助于标识信号与其他方法的区别。

在声明完信号后,我们需要在Godot编辑器中对脚本进行编译(Build),以便编辑器的节点选项卡中能够显示该信号。编译之后,我们可以像连接其他信号一样,将该信号连接到其他节点或方法。
在这里插入图片描述
如图所示,在Build之后,节点中出现了我们刚刚声明的信号。
在这里插入图片描述
自定义信号还可以包含参数,以在发出信号时传递相关信息。

发射信号

在某个需要触发信号的地方,通过调用EmitSignal方法来发出信号,并指定要发出的信号名称和相关参数。

public void BeHit()
{
    // 发出信号
    EmitSignal(nameof(Hit));
}

带参数的信号

除了简单的无参数信号,信号还可以携带参数来传递更多信息。在信号的声明中,可以定义参数的类型和名称。

using Godot;
using System;

public partial class SignalTest : Node2D
{
	// 声明一个带有参数的信号
    [Signal]
    public delegate void MySignalEventHandler(int value, string message);

    public void SayHello()
    {
        // 发出带有参数的信号
        EmitSignal(nameof(MySignal), 42, "Hello, World!");
    }
}

当发送信号时,可以传递相应的参数。连接到信号的其他对象可以接收到这些参数。

其他文章

Godot配置C#语言编写脚本(使用VSCode作为外部编辑器)
C#的属性讲解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1042352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K8S:pod控制器详解

文章目录 一.pod控制器的基础&#xff11;.pod概念及分类&#xff12;.什么是Pod控制器及其功用&#xff13;.pod控制器有多种类型&#xff08;1&#xff09;ReplicaSet&#xff08;2&#xff09;Deployment&#xff08;3&#xff09;DaemonSet&#xff08;4&#xff09;Statef…

视频截取gif动画怎么操作?轻松一键快速视频转gif

如何截取视频中的一段制作gif动画&#xff1f;当我们看到电影、电视剧等短视频中的某一个片段截取出来做成gif动画&#xff0c;应该如何操作呢&#xff1f;这时候&#xff0c;只需要使用gif制作&#xff08;https://www.gif.cn/&#xff09;工具&#xff0c;不用下载软件&#…

解决typescript报错:不能将类型xxx分配给类型xxx

现象&#xff1a; 这种情况是因为组件传参时&#xff1a; 等号左右两边的数据类型不能严格匹配一致造成的 等号左边data, 查看一下被传参的子组件ProductList的内部data属性: 可以看到data的类型是 &#xff1a; Product[] 而右边的shoppingCartItems来自于&#xff1a; redu…

配置pytorchGPU虚拟环境-python3.7

cuda版本的pytorch包下载地址戳这里 winR->输入cmd->输nvcc -V回车 cuda 11.0 输入以下命令来查找 CUDA 的安装路径&#xff1a; Windows: where nvcc 输入以下命令来查找 cuDNN 的版本号&#xff1a; Windows: where cudnn* cuDNN 8.0 本机安装的是cuda 11.0&…

JS前端树形Tree数据结构使用

前端开发中会经常用到树形结构数据&#xff0c;如多级菜单、商品的多级分类等。数据库的设计和存储都是扁平结构&#xff0c;就会用到各种Tree树结构的转换操作&#xff0c;本文就尝试全面总结一下。 如下示例数据&#xff0c;关键字段id为唯一标识&#xff0c;pid为父级id&am…

稳压器【TPS6283810YFPR 3A】汽车类、TPS629203QDRLRQ1,TPS74550PQWDRVRQ1采用小型6 引脚 WSON 封装。

一、TPS6283810、采用 1.2mm x 0.8mm WCSP 封装的 2.4V-5.5V 输入、6 引脚 3A 微型降压转换器 TPS6283810YFPR是一款高频同步降压转换器&#xff0c;经优化具有小解决方案尺寸和高效率等特性。该器件的输入电压范围为2.4V 至 5.5V&#xff0c;支持常用电池技术。该转换器在中等…

如何永久关闭WPS任务窗口?

1、按住任务窗口上的浮动按钮&#xff0c;将其拖出来成悬浮窗口。 第二步&#xff0c;使用火绒弹窗拦截&#xff0c;选中弹出的窗口&#xff0c;进行拦截。注意&#xff1a;拦截次数为2次。即进行2次操作。 操作两次后&#xff0c;弹窗被拦截&#xff0c;此时Word文档改为双页显…

众佰诚:现在的抖音小店赚钱是真的吗

随着互联网的飞速发展&#xff0c;社交媒体平台如抖音已经成为了许多人赚钱的新途径。在抖音上&#xff0c;越来越多的小店涌现出来&#xff0c;各种各样的产品被推销给用户。但是&#xff0c;人们普遍关心的一个问题是&#xff1a;现在的抖音小店赚钱是真的吗? 首先&#xff…

新闻报道的未来:自动化新闻生成与爬虫技术

概述 自动化新闻生成是一种利用自然语言处理和机器学习技术&#xff0c;从结构化数据中提取信息并生成新闻文章的方法。它可以实现大规模、高效、多样的新闻内容生产。然而&#xff0c;要实现自动化新闻生成&#xff0c;首先需要获取可靠的数据源。这就需要使用爬虫技术&#…

【慕伏白教程】 Linux 深度学习服务器配置指北

文章目录 镜像烧录系统安装系统配置常用包安装 镜像烧录 下载 Ubuntu 镜像 Ubuntu 桌面版 下载烧录工具 balenaEtcher 准备至少 8G 的 空白U盘 开始烧录 系统安装 开机进入BIOS&#xff0c;修改U盘为第一启动 选择 Try or Install Ubuntu 往下拉&#xff0c;选择 中文&a…

14:00面试,14:06就出来了,这问的谁顶得住啊

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

视频汇聚平台EasyCVR从一分屏切换到四分屏后加载记录显示黑屏该如何解决?

视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等&#xff0c;视频智能分析平台EasyCVR融合性强、开放度…

order模块给User模块发送http请求

spring提供了一个工具叫做RestTemplate,这个工具就是spring提供给我们来发送http请求的 1.首先在配置类里面通过bean的形式将RestTemplate注册为spring的一个对象 细节:启动类也是一个配置类

【halcon特征点专题系列】01/4--Harris角点检测

一、说明 Harris角点检测是一种常用的计算机视觉算法,用于检测图像中的角点。它的原理是使用自适应窗口,在每个像素处计算其在该窗口内的灰度值变化量,即在不同方向上移动窗口后的灰度值变化量的平方和。如果该值超过一个阈值,则认为该像素是角点,因为角点处存在着较大的灰…

UG\NX二次开发 信息窗口的一些操作 NXOpen/ListingWindow

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介: UG\NX二次开发 信息窗口的一些操作 NXOpen/ListingWindow 效果: 代码: #include "me.hpp" #include <NXOpen/ListingWindow.hxx> #include <…

c/c++里 对 共用体 union 的内存分配

对union 的内存分配&#xff0c;是按照最大的那个成员分配的。 谢谢

【C++】手撕string(string的模拟实现)

手撕string目录&#xff1a; 一、 Member functions 1.1 constructor 1.2 Copy constructor&#xff08;代码重构&#xff1a;传统写法和现代写法&#xff09; 1.3 operator&#xff08;代码重构&#xff1a;现代写法超级牛逼&#xff09; 1.4 destructor 二、Other mem…

Nature子刊|Binning宏基因组+单菌验证

土壤砷污染是全球性环境问题&#xff0c;在水稻土壤中主要以二甲基砷&#xff08;DMAs&#xff09;形态存在&#xff0c;过量积累DMAs会诱发“直穗病”&#xff0c;影响水稻结实。目前尚无有效的防控措施。今天给大家带来的分享是南京农业大学赵方杰教授团队与中科院微生物所东…

惠普战99移动工作站: 第十三代英特尔酷睿处理器和惠普一站式AI应用开发方案的完美融合

近年来&#xff0c;随着办公移动化、自动化、智能化的需求日益增加&#xff0c;高性能工作站在各行各业的应用中愈加广泛。但传统的台式工作站由于体积大、重量重、缺乏灵活性&#xff0c;已经难以满足许多场景的需求。不过&#xff0c;得益于硬件技术和制造工艺的持续发展&…

CSP-J第二轮试题-2022年-1.2题

文章目录 参考&#xff1a;总结 [CSP-J 2022] 乘方题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示结题思路 [CSP-J 2022] 解密题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 现场真题注意事项 参考&#xff1a; 总…