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

news2024/10/7 8:21:46

一、前言

        委托分单播和多播,多播就是可以绑定多个回调函数,然后一次性执行。这样也可以理解为啥多播没有返回值,多个回调函数执行后返回哪一个都是问题啊。而事件呢官方官方文档说法是“对于事件而言,只有定义事件的类才能调用 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.coloradmin.cn/o/1319826.html

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

相关文章

055:vue工具 --- 人民币小写转化为大写

第055个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

2023年国赛高教杯数学建模D题圈养湖羊的空间利用率解题全过程文档及程序

2023年国赛高教杯数学建模 D题 圈养湖羊的空间利用率 原题再现 规模化的圈养养殖场通常根据牲畜的性别和生长阶段分群饲养,适应不同种类、不同阶段的牲畜对空间的不同要求,以保障牲畜安全和健康;与此同时,也要尽量减少空间闲置所…

读取小数部分

1.题目描述 2.题目分析 //假设字符串为 char arr[] "123.4500"; 1. 找到小数点位置和末尾位置 代码如下: char* start strchr(arr, .);//找到小数点位置char* end start strlen(start) - 1;//找到末尾位置 如果有不知道strchr()用法的同学&#xf…

Html+单页面引入element以及Vue框架引用地址报错(unpkg.com国内无法访问可代替方案)

问题 单页面引入element以及vue 地址报错,请求超时 使用的引用地址是官网上提供,但是没解决问题 一、原因: unpkg也没有幸免于难,也被墙了,unpkg上的相关资源都不能访问,才导致项目资源加载不出。 二、…

linux gdb反汇编定位问题

日前解决一现网问题遇到补丁加载未生效现象,想要验证流程是否走进补丁代码,由于补丁函数和原函数名称一样,且修改代码较少,通过普通gdb方法难以看出是否走进补丁,但可用gdb反汇编方法来验证。 gdb该进程,之…

cdr格式怎么打开?cdr文件查看工具CDR Viewer功能介绍

CDRViewer Pro for Mac是一款专业的矢量图形文件查看器,主要用于打开、浏览和查看CorelDRAW(CDR)文件。以下是该软件的主要功能和特点: CDR文件支持:CDRViewer Pro可以快速加载和显示CorelDRAW(CDR&#x…

python之双链表

双链表简单讲解 双向链表(doubly linked list)是一种链式数据结构,它的每个节点包含两个指针,一个指向前一个节点,一个指向后一个节点。与单向链表相比,双向链表可以在任何位置进行插入和删除操作&#xf…

MDC硬件笔记

学习资源来自华为 MDC210 80pin低速信号接口 4832pin 低速连接器的可插拔次数≤20 MiniFakra 视频接口 MiniFakra 视频连接器的可插拔次数≤ 25 次。 车载以太接口 1、2是100兆,3、4是1000兆 MTB300转接盒 前后面板接口总览: 1 低速接口1 40个…

如何使用Promethues监控系统指标并进行告警

公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。 前言 从零开始:使用Prometheus与Grafana搭建监控系统 克服网络障碍:Prometheus如何通过间接方式采集目标服务数据 在以上二节,我们介绍了如何使…

若依 ruoyi-vue3 集成aj-captcha实现滑块、文字点选验证码

目录 0. 前言0.1 说明 1. 后端部分1.1 添加依赖1.2. 修改 application.yml1.3. 新增 CaptchaRedisService 类1.4. 添加必须文件1.5. 移除不需要的类1.6. 修改登录方法1.7. 新增验证码开关获取接口1.8. 允许匿名访问 2. 前端部分(Vue3)2.1. 新增依赖 cryp…

re:Invent2023大会隆重推出自研芯片Graviton4和Trainium2

目录 一、前言 二、体验Graviton系列产品 (一)创建普通的EC2实例 (二)创建Graviton处理器的EC2实例 (三)远程到服务器 方式1:创建成功时连接 方式2:SSH客户端 方式3:正确…

airpods 无法使用Windows电脑充电的解决方法

打开设置 -> 蓝牙与其他设备 -> 显示更多设备 往下翻,找到“更多设备与打印机设置”,打开设备界面: 打开" Airpods Case",找到“硬件”选项 -> 双击"符合HID标准的供应商定义设备" -> “驱动程序…

Markdown(轻量级标记语言)基本语法教程

学习总是避免不了记笔记,除了在线的记录一些博客外,也会需要一些不方便在线记录的线下笔记,那么找到一个好用方便的适合记录代码的工具,就很重要,这里给大家分享一下Markdown基本语法,可以很简单的达成我们…

GPT-4.5!!!

GPT-4 还没用明白,GPT-4.5 就要发布了。 最近,OpenAI 泄露了 GPT-4.5 的发布页面,除了进一步增强复杂推理和跨模态理解,GPT-4.5 增加了一个更加强大的功能——3D。 3D 功能的进一步支持,也就意味着多模态最后一块版图…

Java21新特性-虚拟线程

虚拟线程是轻量级线程(类似于 Go 中的 “协程(Goroutine)”),可以减少编写、维护和调度高吞吐量并发应用程序的工作量。 线程是可供调度的最小处理单元,它与其他类似的处理单元并发运行,并且在…

设计模式——责任链模式(行为模式)

引言 责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。 问题 假如你正在开发一个在线订购系统。 你希望对系统访问进行限制, 只允…

Rsyslog 8.1901.0 配置Tls模式加密传输log

需求背景:客户需要配置Tls加密模式上传log,老虎动手来搞搞, 推荐看下面的技术文档,官方的没有下面这个好用 https://rsyslog.readthedocs.io/en/latest/tutorials/tls_cert_summary.html 我们可以在github上下载官方文档编译后查看…

OCC 创建简单几何

使用 OCC 创建 正方体和圆柱体&#xff0c;并且通过布尔运算&#xff0c;切除正方体内的圆柱体&#xff0c;保存 stl 几何模型。 #include <iostream> #include <iomanip> #include "BRepPrimAPI_MakeCylinder.hxx" #include "BRepPrimAPI_MakeBox…

Elasticsearch的批量bulk 提交 写入的方式会有顺序问题吗?

Elasticsearch的分布式特性可能会导致写入操作的执行顺序与提交顺序稍有不同。在分布式环境中,Elasticsearch将数据分散到不同的节点上进行存储和处理,因此写入操作的执行顺序可能会受到网络延迟、负载均衡等因素的影响。 根源在于ES的分布式架构。如上图所示,客户端的命令首…

C++学习笔记(十五)

继承 继承是面向对象三大特性之一 有些类与类之间存在特殊的关系&#xff0c;例如下图中&#xff1a; 我们发现&#xff0c;定义这些类时&#xff0c;下级别的成员除了拥有上一级的共性&#xff0c;还有自己的特性。 这个时候我们就可以考虑利用继承的技术&#xff0c;减少重…