虚幻学习笔记18—C++委托(多播)和事件

一、前言

        委托分单播和多播,多播就是可以绑定多个回调函数,然后一次性执行。这样也可以理解为啥多播没有返回值,多个回调函数执行后返回哪一个都是问题啊。而事件呢官方官方文档说法是“对于事件而言,只有定义事件的类才能调用 Broadcast() 函数”。这句话不是很理解,网上有解读是说事件的定义第一个参数就是类名,只有这个类可以调用后面的Broadcast() 函数,但我试了第一个参数是别的类也可以。

        使用的虚幻版本为5.2.1,VS版本为2022.

二、实现

        多播委托分为静态多播委托和动态多播委托,动态多播委托允许在蓝图中使用,静态不行。

2.1、静态多播委托

        首先定义一个静态多播委托,如下,第一个参数为委托的名称,第二个为参数类型。

//多播委托类声明
DECLARE_MULTICAST_DELEGATE_OneParam(MulDelegate_OneParam, FString);//带一个参数的

        然后,再声明委托的类型变量和绑定的方法

	//多播代理声明MulDelegate_OneParam MulDelegate_OneParam1;//多播委托绑定函数定义void MulDelegate_OneParamFunc1(FString strVal);void MulDelegate_OneParamFunc2(FString strVal);

        实现多播绑定函数,将读取到的信息打印到屏幕上。

void ADelegateActor::MulDelegate_OneParamFunc1(FString strVal)
{FString tempStr = strVal.Append("1");GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Blue, FString::Printf(TEXT("%s"), *tempStr));
}void ADelegateActor::MulDelegate_OneParamFunc2(FString strVal)
{FString tempStr = strVal.Append("2");GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Blue, FString::Printf(TEXT("%s"), *tempStr));
}

        绑定和执行

	//多播代理的绑定MulDelegate_OneParam1.AddUObject(this, &ADelegateActor::MulDelegate_OneParamFunc1);MulDelegate_OneParam1.AddUObject(this, &ADelegateActor::MulDelegate_OneParamFunc2);多播代理执行MulDelegate_OneParam1.Broadcast("MulDelegate");

其他的方法可以参考单播委托的调用和使用。

2.2、动态多播委托

        动态多播的声明,注意:名称一定要F开头不然会编译报错“Delegate type declarations must start with F”。

//动态多播委托,区别在于它可以暴露给蓝图,在蓝图中进行事件的绑定
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDynamicMulDelegate, FString, param);//一个参数的动态多播委托,名称一定要F开头不然会编译报错“Delegate type declarations must start with F”

动态多播的变量声明,要让蓝图中调用因此需要“UPROPERTY”标签。

	//动态多播代理变量声明UPROPERTY(BlueprintAssignable)//可以让代理在蓝图中进行绑定FDynamicMulDelegate DynamicMulDelegate;

        编译代码成功后,在编辑器中创建动态多播类的蓝图,然后在蓝图中输入上述定义的变量名点击“分配DynamicMulDelegate",这样就能创建一个带绑定的自定义蓝图事件,如图2.2.1所示,然后在开始函数时执行动态绑定。

图2.2.1

调用还是再C++代码中

	动态多播代理执行DynamicMulDelegate.Broadcast("Dynamic Mul Cast");
2.3、事件

事件的声明,第一个参数是类名,我这里使用了其他的原始C++类(不继承任何虚幻类的类),第二个参数为事件的名称,第三个为参数类型。

//事件声明
DECLARE_EVENT_OneParam(MyRawClass, MyActionEvent1, FString);

定义事件的变量

	//事件变量MyActionEvent1 ActionEvent;

事件的绑定和执行

	ActionEvent.AddUObject(this, &ADelegateActor::OneParamDelegateFunc);ActionEvent.Broadcast("Event Call");

三、总结

3.1、动态多播委托的第一个参数名称必须以”F“开头,否则会编译报错。

3.2、事件和委托目前还未发现有什么不同之处,我定义事件时第一个参数为原始C++类,调用的时候在别的类也可以执行,跟官方说的不太一致。

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

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

相关文章

用python编写一个对列表降序排列的方法。 定义函数des(),该函数接收一个整数列表作为参数。 在函数内部,实现降序排序。

编写一个对列表降序排列的方法。 定义函数des(),该函数接收一个整数列表作为参数。 在函数内部,实现降序排序。 然后,返回排序后的列表。 最后,在函数外部打印排序后的列表。 以下是一个使用Python编写的对列表降序排列的方法的示…

西南科技大学数据库实验七(综合实验—选课系统综合查询)

一、实验目的 存储过程与触发器 二、实验任务 一、创建数据库及表(提供数据库文件mytables.sql,可以导入,可以拷贝) 1、创建班级表class 2、创建学生表student 3、创建选课表choose 4、创建课程表course 5、创建教师表 teacher 1、【例8.1】创建一个名为student_coun…

Spring boot+nacos+mysql通过修改配置密码自动刷新数据库连接

由于安全需要,数据库需要定时更新密码,快速更新服务连接数据库密码,现在提供参考方案如下 集中nacos配置,将密码集中收集到一个配置文件里 spring:datasource:password: 123456 在项目中使用nacos的配置中心,同时设…

后端笔记之gin框架学习

gin框架学习 1. 使用脚手架搭建gin框架2. 应用框架3. 路由管理4.自定义中间件的使用5. 通过中间件设置路由权限校验1. 自定义校验2. 配置跨域3. 使用jwt进行tokn校验 6. 接口入参获取和绑定2. 参数校验3. protobuf 7. 集成mysql数据库1. gorm使用 1. 使用脚手架搭建gin框架 gi…

MapReduce和Yarn部署+入门

看的黑马视频记的笔记 目录 1.入门知识点 分布式计算: 概念: 两种模式: MapReduce(分布式计算,分散汇总模式) 概念 执行原理 注: Yarn(分布式资源调度) 概述 Y…

VS Code配置Go语言开发环境

提示:首先这是一个新型语言,最好把vscode更新到最新版。 1:去官网下载Go语言编译器,之后配置到系统环境中,能看到版本就行。 2:创建一个文件夹,存放go的工具文件,我的在D:\GoFile\G…

【数据分析之Numpy】Numpy中复制函数numpy.repeat()与numpy.tile()的使用方法及区别

一、简介 numpy.repeat()与numpy.tile()都是Numpy库中的复制函数,用于将数组中的元素重复指定的次数。 numpy.repeat()函数接受三个参数:要重复的数组、重复的次数和重复的轴。 numpy.tile()函数接受两个参数:要重复的数组和重复的次数。 二…

前端技术的新趋势:React、Vue与Angular的比较

本文将比较当前最流行的前端框架React、Vue和Angular,探讨它们各自的优缺点,并分析它们在未来的发展趋势。 随着互联网技术的不断发展,前端技术也在不断演进。React、Vue和Angular作为当前最流行的前端框架,它们在开发效率、性能和…

使用AI大模型生成动漫人像

在线体验:点击【图像处理】即可使用 public static final String SELFIE_ANIME "https://aip.baidubce.com/rest/2.0/image-process/v1/selfie_anime"; private static final String TOKEN_URL "https://aip.baidubce.com/oauth/2.0/token";…

HTTP协议:简单易用、可扩展的应用层协议

HTTP 协议是一种基于 TCP/IP 的应用层协议,是最常用的Web协议之一,用于客户端和服务器之间传递和交换数据,也常被称为超文本传输协议。在HTTP协议中,每一个TCP连接会产生两个并行的流,一个是传输客户端发送给服务器的请…

elasticsearch简单相关操作

查看索引 GET _cat/indices //获取所有的index GET account发送post不带id新建数据 POST user/_doc/ {"name":"bobby","compamy":"imooc" }如果post带id就和put一样的操作了, put是不允许不带id的 post _create 没有就…

【前端】vscode 相关插件

一 插件: 01、ESLint 用来识别并检查ECMAScript/JavaScript 代码的工具 02、Prettier 用来格式化代码,如.js、.vue、css等都可以进行格式化 03、Vetur 用来识别并高亮vue语法 04、EditorConfig 用来设置vscode的编程行为 二、安装依赖 01、…

干涉光学测试导论

1.用于光学测试的基本干涉仪 2。相移干涉术 3。专业光学测试 4。长波长干涉术 5。非球面试验 6。表面微观结构的测量 7。绝对测量 8。结束语 第1部分-光学测试用基本干涉仪 (1)双光束干涉 (2)菲佐干涉仪和特维曼-格林干涉仪 (3)测试平面和球面的基本技术 (4)球面的基本…

dart遍历树及查找

省市区三级联动后端返回用户选择字符串,前端遍历查找,本来想用递归。后来看了一篇文章,作者使用js写的。目前,我在写flutter项目所以该用dart。文章地址,作者讲解的很详细,不再赘述。 /** 深度遍历树查找*…

QT视频报错:DirectShowPlayerService::doRender: Unresolved error code 0x80040266

原因:QT使用windows默认解码器,如果没有安装有相关DirectShowService解码器,则运行程序也是没法播放视频的,必须安装相关directshow解码器,安装位置在你的qt安装目录,安装完重启电脑就可以解决了。 解决办…

如何获取旧版 macOS

识别机型支持的最新的兼容操作系统 识别 MacBook Air - 官方 Apple 支持 (中国) 社区网站:AppStore 无法找到macos cata… - Apple 社区 官网链接隐藏比较深:如何下载和安装 macOS - 官方 Apple 支持 (中国) 获取磁盘映像 Lion 10.7 https://update…

maui中实现加载更多 RefreshView跟ListView(2)

一个类似商品例表的下拉效果&#xff1a; 代码 新增个类为商品商体类 public class ProductItem{public string ImageSource { get; set; }public string ProductName { get; set; }public string Price { get; set; }}界面代码&#xff1a; <?xml version"1.0&quo…

我的创作纪念日365

机缘 提示&#xff1a;可以和大家分享最初成为创作者的初心 例如&#xff1a; 实战项目中的经验分享日常学习过程中的记录通过文章进行技术交流… 收获 提示&#xff1a;在创作的过程中都有哪些收获 例如&#xff1a; 获得了多少粉丝的关注获得了多少正向的反馈&#xff0c…

通过费用流中的贪心来保证计数正确性:P4249剪刀石头布

https://vj.imken.moe/contest/598718#problem/K 三元环数量尽量多&#xff0c;也就是非三元环数量尽可能少。非三元环的充要条件是存在一个点度数为2&#xff0c;而每条边可以给一个点一个度数&#xff0c;然后就变成了经典网络流问题。 但是&#xff0c;对于一个点&#xf…

计算机与自动医疗检查仓:技术革新引领医疗未来

计算机与自动医疗检查仓&#xff1a;技术革新引领医疗未来 一、引言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;已经成为现代社会不可或缺的一部分。它们的应用领域日益扩展&#xff0c;从简单的日常任务到复杂…