Godot信号教程(使用C#语言)| 创建自定义信号 | 发出自定义信号 | 使用代码监听信号
文章目录
- 信号是什么
- 连接信号
- 使用编辑器连接信号
- 使用代码连接信号
- 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#的属性讲解
相关文章:
Godot信号教程(使用C#语言)| 创建自定义信号 | 发出自定义信号 | 使用代码监听信号
文章目录 信号是什么连接信号使用编辑器连接信号使用代码连接信号Lambda 自定义信号声明信号发射信号带参数的信号 其他文章 信号是什么 在Godot游戏引擎中,信号是一种用于对象之间通信的重要机制。它允许一个对象发出信号,而其他对象可以连接到这个信号…...
分布式文件存储系统minio、大文件分片传输
上传大文件 1、Promise对象 Promise 对象代表一个异步操作,有三种状态: pending: 初始状态,不是成功或失败状态。fulfilled: 意味着操作成功完成。rejected: 意味着操作失败。 只有异步操作的结果,可以决定当前是哪一种状态&a…...
在 msys2/mingw 下安装及编译 opencv
最简单就是直接安装 pacman -S mingw-w64-x86_64-opencv 以下记录一下编译的过程 1. 安装编译工具及第三方库 pacman -S --needed base-devel mingw-w64-x86_64-toolchain unzip gccpacman -S python mingw-w64-x86_64-python2 mingw-w64-x86_64-gtk3 mingw-w64-x86_64-…...
java 根据身份证号码判断性别
在Java中,您可以根据身份证号码的规则来判断性别。中国的身份证号码通常采用的是以下规则: 第17位数字代表性别,奇数表示男性,偶数表示女性。 通常,男性的出生日期的第15、16位数字是01,女性是02。 请注意&…...
信息服务上线渗透检测网络安全检查报告和解决方案4(XSS漏洞修复)
系列文章目录 信息服务上线渗透检测网络安全检查报告和解决方案2(安装文件信息泄漏、管理路径泄漏、XSS漏洞、弱口令、逻辑漏洞、终极上传漏洞升级)信息服务上线渗透检测网络安全检查报告和解决方案信息服务上线渗透检测网络安全检查报告和解决方案3(系统漏洞扫描、相对路径覆…...
【SQL】mysql创建定时任务执行存储过程--20230928
1.先设定时区 https://blog.csdn.net/m0_46629123/article/details/133382375 输入命令show variables like “%time_zone%”;(注意分号结尾)设置时区,输入 set global time_zone “8:00”; 回车,然后退出重启(一定记得重启&am…...
安全基础 --- MySQL数据库解析
MySQL的ACID (1)ACID是衡量事务的四个特性 原子性(Atomicity,或称不可分割性)一致性(Consistency)隔离性(Isolation)持久性(Durability) &…...
软件设计师考试学习3
开发模型 瀑布模型 现在基本被淘汰了 是一种结构化方法中的模型,一般用于结构化开发 问题在于需求阶段需求不可能一次搞清楚,很可能做完推翻重做 适用于需求明确或二次开发 原型模型、演化模型、增量模型 原型是为了解决需求不明确的问题 原型在项目…...
使用LDA(线性判别公式)进行iris鸢尾花的分类
线性判别分析((Linear Discriminant Analysis ,简称 LDA)是一种经典的线性学习方法,在二分类问题上因为最早由 [Fisher,1936] 提出,亦称 ”Fisher 判别分析“。并且LDA也是一种监督学习的降维技术,也就是说它的数据集的每个样本都…...
王学岗生成泛型的简易Builder
github大佬地址 使用 //class 可以传参DataBean.classpublic static <T> T handlerJson(String json, Class<T> tClass) {T resultData null;if (CommonUtils.StringNotNull(json) && !nullString.equals(json)) {if (isArray(json)) {resultData BaseN…...
kafka消息队列简单使用
下面是使用Spring Boot和Kafka实现消息队列的简单例子: 引入依赖 在pom.xml中添加以下依赖: <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.7.5&l…...
性能优化实战使用CountDownLatch
1.分析问题 原程序是分页查询EventAffinityScoreDO表的数据,每次获取2000条在一个个遍历去更新EventAffinityScoreDO表的数据。但是这样耗时比较慢,测试过30万的数据需要2小时 private void eventSubjectHandle(String tenantId, String eventSubject) …...
基于视频技术与AI检测算法的体育场馆远程视频智能化监控方案
一、方案背景 近年来,随着居民体育运动意识的增强,体育场馆成为居民体育锻炼的重要场所。但使用场馆内的器材时,可能发生受伤意外,甚至牵扯责任赔偿纠纷问题。同时,物品丢失、人力巡逻成本问题突出,体育场…...
leetcodetop100(29) K 个一组翻转链表
K 个一组翻转链表 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改…...
最新影视视频微信小程序源码-带支付和采集功能/微信小程序影视源码PHP(更新)
源码简介: 这个影视视频微信小程序源码,新更新的,它还带支付和采集功能,作为微信小程序影视源码,它可以为用户 提供丰富的影视资源,包括电影、电视剧、综艺节目等。 这个小程序影视源码,还带有…...
C++:vector 定义,用法,作用,注意点
C 中的 vector 是标准模板库(STL)提供的一种动态数组容器,它提供了一组强大的方法来管理和操作可变大小的数组。以下是关于 vector 的定义、用法、作用以及一些注意点: 定义: 要使用 vector,首先需要包含 …...
Firecamp2.7.1exe安装与工具调试向后端发送SocketIO请求
背景: 笔者在python使用socket-io包时需要一个测试工具,选择了firecamp这个测试工具来发送请求。 参考视频与exe资源包: Firecamp2.7.1exe安装包以及基本使用说明文档(以SocketIO为例).zip资源-CSDN文库 15_send方法…...
MySQL到TiDB:Hive Metastore横向扩展之路
作者:vivo 互联网大数据团队 - Wang Zhiwen 本文介绍了vivo在大数据元数据服务横向扩展道路上的探索历程,由实际面临的问题出发,对当前主流的横向扩展方案进行了调研及对比测试,通过多方面对比数据择优选择TiDB方案。其次分享了整…...
算法通关村-----寻找祖先问题
最近公共祖先 问题描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一…...
Sentinel结合Nacos实现配置持久化(全面)
1、前言 我们在进行分布式系统的开发中,无论是在开发环境还是发布环境,配置一定不能是内存形式的,因为系统可能会在中途宕机或者重启,所以如果放在内存中,那么配置在服务停到就是就会消失,那么此时就需要重…...
Verilog中什么是断言?
断言就是在我们的程序中插入一句代码,这句代码只有仿真的时候才会生效,这段代码的作用是帮助我们判断某个条件是否满足(例如某个数据是否超出了范围),如果条件不满足(数据超出了范围)࿰…...
Oracle分区的使用详解:创建、修改和删除分区,处理分区已满或不存在的插入数据,以及分区历史数据与近期数据的操作指南
一、前言 什么是表分区: Oracle的分区是一种将表或索引数据分割为更小、更易管理的部分的技术。它可以提高查询性能、简化维护操作,并提供更好的数据组织和管理。 表分区和表空间的区别和联系: 在Oracle数据库中,表空间(Tablespace)是用于存储表、索引和其他数据库对…...
SLAM从入门到精通(amcl定位使用)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 学习slam,一般就是所谓的边定位、边制图的知识。然而在实际生产过程中,比如扫地机器人、agv、巡检机器人、农业机器人&…...
【C/C++】C/C++面试八股
C/C面试八股 C和C语言的区别简单介绍一下三大特性多态的实现原理虚函数的构成原理虚函数的调用原理虚表指针在什么地方进行初始化的?构造函数为什么不能是虚函数虚函数和纯虚函数的区别抽象类类对象的对象模型内存对齐是什么?为什么要内存对齐static关键…...
Scala第八章节
Scala第八章节 scala总目录 章节目标 能够使用trait独立完成适配器, 模板方法, 职责链设计模式能够独立叙述trait的构造机制能够了解trait继承class的写法能够独立完成程序员案例 1. 特质入门 1.1 概述 有些时候, 我们会遇到一些特定的需求, 即: 在不影响当前继承体系的情…...
k8s-实战——kubeadm二进制编译
文章目录 源码编译获取源码修改证书有效期修改 CA 有效期为 100 年(默认为 10 年)修改证书有效期为 100 年(默认为 1 年)CentOS7.9环境准备centos脚本安装执行脚本脚本内容手动安装验证编译查看编译后的版本信息参考链接脚本修改源码编译 源码编译kubeadm文件、修改证书的默…...
vite 和 webpack 的区别
1. 构建原理: Webpack 是一个静态模块打包器,通过对项目中的JavaScript、css、Image 等文件进行分析,生成对应的静态资源,并且通过一些插件和加载器来实现各种功能。 Vite 是一种基于浏览器元素 ES 模块解析构建工具,…...
传统遗产与技术相遇,古彝文的数字化与保护
古彝文是中国彝族的传统文字,具有悠久的历史和文化价值。然而,由于古彝文的形状复杂且没有标准化的字符集,对其进行文字识别一直是一项具有挑战性的任务。本文介绍了古彝文合合信息的文字识别技术,旨在提高古彝文的自动识别准确性…...
多维时序 | MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测(SE注意力机制)
多维时序 | MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测(SE注意力机制) 目录 多维时序 | MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测(SE注意力机制)预测效果基本描述模型描述程序设计参考资料 预测效果 基本描述…...
1042 字符统计
description 请编写程序,找出一段给定文字中出现最频繁的那个英文字母。 输入格式: 输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束ÿ…...
无锡网站备案/专门看网站的浏览器
...
延吉网站建设公司/萧山seo
前言: 本文是前一片文章《深入浅出之正则表达式(一)》的续篇,在本文中讲述了正则表达式中的组与向后引用,先前向后查看,条件测试,单词边界,选择符等表达式及例子,并…...
wordpress主题还原/seo发包软件
标星★公众号,第一时间获取最新研究作者:Rocky Kev编译:公众号编辑部近期原创文章:♥ 基于无监督学习的期权定价异常检测(代码数据)♥ 5种机器学习算法在预测股价的应用(代码数据)♥ 深入研读:利用Twitter情绪去预测股…...
商城网站建设代理商/产品销售方案与营销策略
更多精彩内容请关注我们在群雄逐鹿的中国超融合(HCI)市场上,谁最具技术底蕴?谁又能与国际一线大厂竞争?谁能扛起新一代IT基础架构变革的大旗?Gartner给出了自己的解答。在Gartner最新发布的报告“Competiti…...
网站建设和管理情况自查报告/安卓优化
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼7.三目元运算符与三目元表达式三目元表达式是由条件运算符和变量构成的。格式:?:其中,表达式1的值为bool类型,表达式2和表达式3的值可以是任何类型。条件表达式的执行顺序…...
常州网站建设公司方案/怎样弄一个自己的平台
在开发中免不了和他人一起团队协作提交代码,为了防止大家每次提交代码时,git commit -m ’ 的提交信息不明所以,所以Angular 团队提出了 Git 约定式提交。这只是一种约定规范,并不是强制要求,具体可参考:An…...