Godot 学习笔记(2):信号深入讲解

文章目录

  • 前言
  • 相关链接
  • 环境
  • 信号
    • 简单项目搭建
    • 默认的信号
      • 先在label里面预制接收函数
      • 添加信号
    • 自定义无参数信号
      • 为了做区分,我们在label新增一个函数
    • 自定义带参数信号
      • Button代码
      • label代码
      • 连接信号
    • 自定义复杂参数信号
      • 自定义GodotObject类
      • Button
      • Label
      • 连接信号
    • 信号函数回调
      • Callable
        • Button
        • Lable
        • 连接信号
        • 参数个数不对的异常问题
        • 解决异常方法
  • 总结

前言

这里我们深入学习一下Godot的信号。对于数据流的控制一直是前端最重要的内容。

相关链接

Godot Engine 4.2 简体中文文档

环境

  • visual studio 2022
  • .net core 8.0
  • godot.net 4.2.1
  • window 10

信号

信号就是传输数据的一种方式,信号是单向数据流,信号默认是从下往上传递数据的。即子传父

简单项目搭建

在这里插入图片描述

默认的信号

信号的发出和接收是需要配合的,有点像【发布订阅】模式。信号的发布是带有参数的。这里Button是发布者,Lable是订阅者。

在这里插入图片描述

我这里建议先在订阅者一方先新建函数,再链接信号。因为Godot在gdscript中是可以自动新建代码的,但是在.net 中需要我们手动新建代码。

先在label里面预制接收函数

using Godot;
using System;public partial class Label : Godot.Label
{private int num = 0;// Called when the node enters the scene tree for the first time.public override void _Ready(){this.Text = "修改";}// Called every frame. 'delta' is the elapsed time since the previous frame.public override void _Process(double delta){}/// <summary>/// 接受按钮点击/// </summary>public void RecevieButtonDown(){this.Text = $"{num}";num++;}}

添加信号

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自定义无参数信号

我们在Button的代码里面添加信号

using Godot;
using System;public partial class Button : Godot.Button
{// Called when the node enters the scene tree for the first time./// <summary>/// 添加自定义信号/// </summary>[Signal]public delegate void MyButtonClickEventHandler();public override void _Ready(){//在按钮按下时添加信号发送this.ButtonDown += () => EmitSignal(nameof(MyButtonClick));}// Called every frame. 'delta' is the elapsed time since the previous frame.public override void _Process(double delta){}}

在这里插入图片描述

为了做区分,我们在label新增一个函数

	/// <summary>/// 为了做区分,我们新增一个函数/// </summary>public void RecevieButtonDown2(){GD.Print("我是自定义无参信号");this.Text = $"{num}";num++;}

在这里插入图片描述
在这里插入图片描述

自定义带参数信号

这边比较复杂,需要了解C# 的delegate。

C#中委托(delegate)与事件(event)的快速理解

不理解的话那就先凑合着用好了。

Button代码

using Godot;
using System;public partial class Button : Godot.Button
{// Called when the node enters the scene tree for the first time./// <summary>/// 添加自定义信号/// </summary>[Signal]public delegate void MyButtonClickEventHandler();private int num = 0;/// <summary>/// 添加带参数型号/// </summary>[Signal]public delegate void AddNumberEventHandler(int number);public override void _Ready(){//我们给AddNumber添加功能,delegate只能添加或者删除函数,有点类似于触发器。//每次调用的时候,num自动++AddNumber += (item) => num++;//在按钮按下时添加信号发送this.ButtonDown += () =>{EmitSignal(nameof(MyButtonClick));//触发按钮信号EmitSignal(nameof(AddNumber),num);};}// Called every frame. 'delta' is the elapsed time since the previous frame.public override void _Process(double delta){}}

label代码

using Godot;
using System;public partial class Label : Godot.Label
{private int num = 0;// Called when the node enters the scene tree for the first time.public override void _Ready(){this.Text = "修改";}// Called every frame. 'delta' is the elapsed time since the previous frame.public override void _Process(double delta){}/// <summary>/// 接受按钮点击/// </summary>public void RecevieButtonDown(){this.Text = $"{num}";num++;}/// <summary>/// 为了做区分,我们新增一个函数/// </summary>public void RecevieButtonDown2(){GD.Print("我是自定义无参信号");this.Text = $"{num}";num++;}public void AddNumber(int number){this.Text = $"{number}";GD.Print($"我是代参数信号,num:[{number}]");}}

连接信号

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自定义复杂参数信号

在这里插入图片描述

GD0202: The parameter of the delegate signature of the signal is not supported¶

在这里插入图片描述

想要了解更多差异,需要看这个文章。

Godot Engine 4.2 简体中文文档 编写脚本 C#/.NET

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自定义GodotObject类

using Godot;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CSharpSimpleTest.models
{public partial class Student:GodotObject{public string Name = "小王";public int Age = 5;public Student() { }}
}

Button

using CSharpSimpleTest.models;
using Godot;
using System;public partial class Button : Godot.Button
{// Called when the node enters the scene tree for the first time./// <summary>/// 添加自定义信号/// </summary>[Signal]public delegate void MyButtonClickEventHandler();private int num = 0;/// <summary>/// 添加带参数型号/// </summary>[Signal]public delegate void AddNumberEventHandler(int number);private Student student = new Student() { Name = "小王",Age = 24};[Signal]public delegate void StudentEventHandler(Student student);  public override void _Ready(){//我们给AddNumber添加功能,delegate只能添加或者删除函数,有点类似于触发器。//每次调用的时候,num自动++AddNumber += (item) => num++;//在按钮按下时添加信号发送this.ButtonDown += () =>{EmitSignal(nameof(MyButtonClick));//触发按钮信号EmitSignal(nameof(AddNumber),num);//触发Student信号EmitSignal(nameof(Student),student);};}// Called every frame. 'delta' is the elapsed time since the previous frame.public override void _Process(double delta){}}

Label

在这里插入图片描述

using CSharpSimpleTest.models;
using Godot;
using System;public partial class Label : Godot.Label
{private int num = 0;// Called when the node enters the scene tree for the first time.public override void _Ready(){this.Text = "修改";}// Called every frame. 'delta' is the elapsed time since the previous frame.public override void _Process(double delta){}/// <summary>/// 接受按钮点击/// </summary>public void RecevieButtonDown(){this.Text = $"{num}";num++;}/// <summary>/// 为了做区分,我们新增一个函数/// </summary>public void RecevieButtonDown2(){GD.Print("我是自定义无参信号");this.Text = $"{num}";num++;}public void AddNumber(int number){this.Text = $"{number}";GD.Print($"我是代参数信号,num:[{number}]");}/// <summary>/// 自定义复杂参数/// </summary>/// <param name="student"></param>public void ReviceStudent(Student student){this.Text = $"student:Name[{student.Name}],Age[{student.Age}]";}}

连接信号

在这里插入图片描述

至于对于的显示逻辑,是基于C# Variant这个类

C# Variant

在这里插入图片描述

在这里插入图片描述

信号函数回调

Callable

[教程]Godot4 GDscript Callable类型和匿名函数(lambda)的使用

在这里插入图片描述

在这里插入图片描述

Button
using Godot;
using System;
using System.Diagnostics;public partial class test_node : Node2D
{// Called when the node enters the scene tree for the first time.private Label _lable;private Button _button;private int num = 0;[Signal]public delegate int NumAddEventHandler();public override void _Ready(){_lable = this.GetNode<Label>("Label");_button = this.GetNode<Button>("Button");_lable.Text = "修改";_button.ButtonDown += _button_ButtonDown;NumAdd += () => num;}public void _button_ButtonDown(){_lable.Text = $"按下修改{num}";GD.Print($"按下修改{num}");num++;}// Called every frame. 'delta' is the elapsed time since the previous frame.public override void _Process(double delta){}}
Lable
using CSharpSimpleTest.models;
using Godot;
using System;public partial class Label : Godot.Label
{private int num = 0;// Called when the node enters the scene tree for the first time.public override void _Ready(){this.Text = "修改";}// Called every frame. 'delta' is the elapsed time since the previous frame.public override void _Process(double delta){}/// <summary>/// 接受按钮点击/// </summary>public void RecevieButtonDown(){this.Text = $"{num}";num++;}/// <summary>/// 为了做区分,我们新增一个函数/// </summary>public void RecevieButtonDown2(){GD.Print("我是自定义无参信号");this.Text = $"{num}";num++;}public void AddNumber(int number){this.Text = $"{number}";GD.Print($"我是代参数信号,num:[{number}]");}/// <summary>/// 自定义复杂参数/// </summary>/// <param name="student"></param>public void ReviceStudent(Student student){this.Text = $"student:Name[{student.Name}],Age[{student.Age}]";}public void CallBackTest(Callable callable, Callable callable2){callable.Call();callable2.Call(23);}}
连接信号

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

参数个数不对的异常问题
public void CallBackTest(Callable callable, Callable callable2)
{try{callable.Call();//callable2.Call(23);//如果我们参数个数不对,也不会在C#中抛出异常,会在Godot中抛出异常callable2.Call();}catch (Exception e){GD.Print("发送异常");GD.Print(e.ToString());}}

在这里插入图片描述
在这里插入图片描述
这是个十分危险的使用,因为我们无法溯源对应的代码,也无法try catch找到异常的代码,因为这个代码是在C++中间运行的。

解决异常方法

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

总结

信号就是Godot中数据沟通方式。信号的出现就是为了将复杂的数据处理简单化为接口的形式。再加上Godot中的Sence,这个就有利于我们面向对象的编程习惯。

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

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

相关文章

数字IC实践项目(9)—SNN加速器的设计和实现(tiny_ODIN)

数字IC实践项目&#xff08;9&#xff09;—基于Verilog的SNN加速器 写在前面的话项目整体框图完整电路框图 项目简介和学习目的软件环境要求 Wave&CoverageTiming&#xff0c;Area & Power总结 写在前面的话 项目介绍&#xff1a; SNN硬件加速器是一种专为脉冲神经网…

uniapp样式穿透修改uview的按钮button图标

需求&#xff1a; 想给按钮icon和text改字体颜色&#xff0c;结果发现图标颜色并没有改变 .u-button{width: 300rpx;background-color: aliceblue;color: #aaaa7f;margin-top: 20rpx; }接下来用样式穿透解决 1、首先&#xff0c;给UI组件包裹一层view <view class"t…

ElasticSearch:数据的魔法世界

​ 欢迎来到ElasticSearch的奇妙之旅&#xff01;在这个充满魔法的搜索引擎世界中&#xff0c;数据不再是沉闷的数字和字母&#xff0c;而是变得充满活力和灵动。无论你是刚刚踏入数据探索的小白&#xff0c;还是已经对搜索引擎有所了解的行者&#xff0c;本篇博客都将为你揭示…

unity内存优化之AB包篇(微信小游戏)

1.搭建资源服务器使用(HFS软件(https://www.pianshen.com/article/54621708008/)) using System.Collections; using System.Collections.Generic; using UnityEngine;using System;public class Singleton<T> where T : class, new() {private static readonly Lazy<…

【集成开发环境】-VS Code:C/C++ 环境配置

简介 VS Code&#xff0c;全称Visual Studio Code&#xff0c;是一款由微软开发的跨平台源代码编辑器。它支持Windows、Linux和macOS等操作系统&#xff0c;并且具有轻量级、高效、可扩展等特点&#xff0c;深受广大开发者的喜爱。 VS Code拥有丰富的功能特性&#xff0c;包括…

计算机三级网络技术综合题第三题、第四题详细解析

第三大题 DHCP报文分析&#xff08;10分&#xff09; 一、DHCP工作流程&#xff08;一般情况下&#xff09; 报文摘要 对应上面报文1—4 报文1、3DHCP&#xff1a;Request&#xff1b; 报文2、4DHCP&#xff1a;Reply。 例题&#xff08;第三套&#xff09;&#xff1a;在一…

程序员入行忠告!

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 关注我&#xff0c;紧跟本系列专栏文章&#xff0c;咱们下篇再续&#xff01; 作者简介&#xff1a;魔都技术专家兼架构&#xff0c;多家大厂后端一线研发经验&#xff0c;各大技术社区头部…

十五、自回归(AutoRegressive)和自编码(AutoEncoding)语言模型

参考自回归语言模型&#xff08;AR&#xff09;和自编码语言模型&#xff08;AE&#xff09; 1 自回归语言模型&#xff08; AR&#xff09; 自回归语言模型&#xff08;AR&#xff09;就是根据上文内容&#xff08;或下文内容&#xff09;预测下一个&#xff08;或前一个&…

安装OpenEBS,镜像总是报错ImagePullBackOff或者ErrImagePull的解决方法

按照 KubeSphere 官方文档安装 OpenEBS&#xff0c;镜像总是报错ImagePullBackOff或者ErrImagePull的解决方法 helm 有很多更换 源 的文章&#xff0c;有一些是写更换阿里云的源&#xff0c;但是阿里云的源根本没更新OpenEBS的镜像。 在网上找到1个可用的源&#xff1a; 可用的…

探讨TCP的可靠性以及三次握手的奥秘

&#x1f31f; 欢迎来到 我的博客&#xff01; &#x1f308; &#x1f4a1; 探索未知, 分享知识 !&#x1f4ab; 本文目录 1. TCP的可靠性机制1.2可靠性的基础上,尽可能得提高效率 2. TCP三次握手过程3. 为何不是四次握手&#xff1f; 在互联网的复杂世界中&#xff0c;TCP&am…

基于springboot的高校教师教研信息填报系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

亚马逊云科技Glue

Glue 最重要的部分&#xff0c; ETL&#xff1a;用于从 A 点&#xff08;我们的源数据&#xff09;提取、转换和加载数据到 B 点&#xff08;目标文件或数据存储库&#xff09;。 AWS Glue 会为您执行大量此类工作。 转换通常是更繁重的工作&#xff0c;需要从各种来源进行组合…

【嵌入式DIY实例】-自动割草机器

自动割草机器 文章目录 自动割草机器1、割草机器介绍2、硬件准备3、功能设计4、硬件接线5、代码实现本文将介绍如何使用 Arduino 构建一个简易自动割草机机器人或割草机机器人。该机器人可以自动剪掉花园里多余的草。如果花园里有障碍物,它会自动改变方向。帮助以减少人力。 警…

【Elasticsearch】windows安装elasticsearch教程及遇到的坑

一、安装参考 1、安装参考&#xff1a;ES的安装使用(windows版) elasticsearch的下载地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch ik分词器的下载地址&#xff1a;https://github.com/medcl/elasticsearch-analysis-ik/releases kibana可视化工具下载…

网络编程套接字——实现简单的UDP网络程序

目录 1、预备知识 1.1、认识端口号 1.2、端口号 vs 进程pid 1.3、认识TCP协议 1.4、认识UDP协议 1.5、网络字节序 2、socket编程接口 2.1、socket常见API 2.2、sockaddr结构 3、实现一个简易的UDP服务器和客户端通信 log.hpp UdpServer.hpp UdpClient.cc Main.cc…

upload-labs通关方式

pass-1 通过弹窗可推断此关卡的语言大概率为js&#xff0c;因此得出两种解决办法 方法一 浏览器禁用js 关闭后就逃出了js的验证就可以正常php文件 上传成功后打开图片链接根据你写的一句话木马执行它&#xff0c;我这里采用phpinfo&#xff08;&#xff09; 方法二 在控制台…

【网络编程基础(一)】网络基础和SOCKET

这里写目录标题 1、网络三要素2、IPV4和IPV6区别3、网络交互3.1、交互模型图3.2、基础通信协议3.3、OSI参考模型与TCP/IP参考模型对应关系 4、SOCKET网络套接字4.1、SOCKET分类4.2、基于流式套接字的编程流程4.3、网络通信雏形4.4、socket函数4.4.1、socket函数示例 4.5、bind函…

蓝桥杯小白赛第 7 场 3.奇偶排序(sort排序 + 双数组)

思路&#xff1a;在第一次看到这道题的时候我第一想法是用冒泡&#xff0c;但好像我的水平还不允许我写出来。我又读了遍题目发现它的数据很小&#xff0c;我就寻思着把它分成奇偶两部分。应该怎么分呢&#xff1f; 当然在读入的时候把这个问题解决就最好了。正好它的数据范围…

【相关问题解答1】bert中文文本摘要代码:import时无法找到包时,几个潜在的原因和解决方法

【相关问题解答1】bert中文文本摘要代码 写在最前面问题1问题描述一些建议import时无法找到包时&#xff0c;几个潜在的原因和解决方法1. 模块或包的命名冲突解决方法&#xff1a; 2. 错误的导入路径解决方法&#xff1a; 3. 第三方库的使用错误解决方法&#xff1a; 4. 包未正…

C++算法学习心得八.动态规划算法(4)

1.零钱兑换&#xff08;322题&#xff09; 题目描述&#xff1a; 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1。 你可以认为每种硬币的数量是无限的。…