UE5 C++ 单播 多播代理 动态多播代理
一. 代理机制,代理也叫做委托,其作用就是提供一种消息机制。 发送方 ,接收方 分别叫做 触发点和执行点。就是软件中的观察者模式的原理。
创建一个C++ Actor作为练习
二.单播代理
创建一个C++ Actor MyDeligateActor作为练习
在MyDeligateActor.h中不需要其他头文件,UE自带的
1.类型的声明(代理的名称,参数类型(个数)),在Actor外
//单播代理类型声明
DECLARE_DELEGATE(NoParamDelegate); //无参数代理
DECLARE_DELEGATE_OneParam(OneParamDelegate,FString); //单播代理 (代理名称,参数类型)
DECLARE_DELEGATE_TwoParams(TwoParamDelegate,FString,int32); //带有两个参数 的单播代理 (代理名称,参数1类型,参数2类型)
DECLARE_DELEGATE_ThreeParams(ThreeParamDelegate,FString,int32,float); //带有三个参数 的单播代理 (代理名称,参数1类型,参数2类型,参数3类型)
DECLARE_DELEGATE_RetVal(FString,RevalDelegate); //带有返回参数的。(返回参数类型,代理名称,)
2.在Actor里声明对应类型的的单播代理变量
//声明单播代理变量 名称
NoParamDelegate NoParamDelegate;
OneParamDelegate OneParamDelegate;
TwoParamDelegate TwoParamDelegate;
ThreeParamDelegate ThreeParamDelegate;
RevalDelegate RevalDelegate;
3.声明代理用绑定的函数
void NoParamFunction();void OneParamFunction(FString str);void TwoParamFunction(FString str,int32 value);void ThreeParamFunction(FString str,int32 value,float value1);FString RevalParamFunction();
4.在CPP中 构造时对单播代理进行绑定 BindUObject(this,&Function);
//代理绑定
NoParamDelegate.BindUObject(this,&AMyDeligateActor::NoParamFunction);
OneParamDelegate.BindUObject(this, &AMyDeligateActor::OneParamFunction);
TwoParamDelegate.BindUObject(this, &AMyDeligateActor::TwoParamFunction);
ThreeParamDelegate.BindUObject(this, &AMyDeligateActor::ThreeParamFunction);
RevalDelegate.BindUObject(this,&AMyDeligateActor::RevalParamFunction);
5.在BeginPlay里执行
//代理执行 判断是否绑定 绑定后就执行NoParamDelegate.ExecuteIfBound();OneParamDelegate.ExecuteIfBound("OneParamDelegate");TwoParamDelegate.ExecuteIfBound("TwoParamDelegate",10);ThreeParamDelegate.ExecuteIfBound("ThreeParamDelegate",10, 5.0f);FString strValue = RevalDelegate.Execute();
6.实现绑定的函数
void AMyDeligateActor::NoParamFunction()
{GEngine->AddOnScreenDebugMessage(-1,5.f,FColor::Red,TEXT("NoParamDelegate"));
}void AMyDeligateActor::OneParamFunction(FString str)
{GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("%s"), *str));
}void AMyDeligateActor::TwoParamFunction(FString str, int32 value)
{GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("%s %d"), *str,value));
}void AMyDeligateActor::ThreeParamFunction(FString str, int32 value, float value1)
{GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("%s %d %f"), *str, value,value1));
}FString AMyDeligateActor::RevalParamFunction()
{ FString str = FString::Printf(TEXT("RevalParamDelegate"));return str;
}
7.生成BP蓝图后,放入场景中。

二. 多播代理
1.多播代理的类型声明(一个代理可绑定多个函数)
//多播代理类型声明(多播代理可以绑定多个函数)
DECLARE_MULTICAST_DELEGATE_OneParam(OneParamMultiDelegate,FString);
2.在Actor里声明对应类型的的多播代理变量
//多播代理声明OneParamMultiDelegate OneParamMultiDelegate;
3.在Actor里声明多播代理绑定的函数
//多播代理绑定的函数UFUNCTION()void MultiDelegateFunction1(FString str);UFUNCTION()void MultiDelegateFunction2(FString str);UFUNCTION()void MultiDelegateFunction3(FString str);
4.CPP实现绑定的函数
void AMyDeligateActor::MultiDelegateFunction1(FString str)
{FString TmpStr = str.Append("1"); //组合一下GEngine->AddOnScreenDebugMessage(-1,5.0f,FColor::Red,FString::Printf(TEXT("%s"),*TmpStr));
}void AMyDeligateActor::MultiDelegateFunction2(FString str)
{FString TmpStr = str.Append("2");GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, FString::Printf(TEXT("%s"), *TmpStr));
}void AMyDeligateActor::MultiDelegateFunction3(FString str)
{FString TmpStr = str.Append("3");GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, FString::Printf(TEXT("%s"), *TmpStr));
}
5.在构造函数里绑定AddUObject(this,&Function);
//多播代理绑定 可绑定多个函数OneParamMultiDelegate.AddUObject(this,&AMyDeligateActor::MultiDelegateFunction1);OneParamMultiDelegate.AddUObject(this, &AMyDeligateActor::MultiDelegateFunction2);OneParamMultiDelegate.AddUObject(this, &AMyDeligateActor::MultiDelegateFunction3);
6.在BeginPlay里执行多播代理。
//执行多播代理OneParamMultiDelegate.Broadcast("OneParamMultiDelegate");
7.效果如下:

三.动态多播代理
1.动态多播代理类型声明,区别在于可以暴露给蓝图,在蓝图中进行事件的绑定。
//DECLARE_MULTICAST_One
//动态多播代理类型声明,区别在于可以暴露给蓝图,在蓝图中进行事件的绑定.
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDynamicMultiDelegate, FString, param);
2.动态多播代理变量的反射声明
//动态多播代理,UPROPERTY(BlueprintAssignable)FDynamicMultiDelegate DynamicMultiDelegate;
3.编译后,在蓝图里绑定。

4.执行动态多播代理
//执行动态多播代理,绑定在我们的蓝图中进行实现DynamicMultiDelegate.Broadcast("DynamicMultiDelegate");
5.效果如下:
![]()
相关文章:
UE5 C++ 单播 多播代理 动态多播代理
一. 代理机制,代理也叫做委托,其作用就是提供一种消息机制。 发送方 ,接收方 分别叫做 触发点和执行点。就是软件中的观察者模式的原理。 创建一个C Actor作为练习 二.单播代理 创建一个C Actor MyDeligateActor作为练习 在MyDeligateAc…...
前端学习、CSS
CSS可以嵌入到HTML中使用。 每个CSS语法包含两部分,选择器和应用的属性。 div用来声明针对页面上的哪些元素生效。 具体设置的属性以键值对形式表示,属性都在{}里,属性之间用;分割,键和值之间用:分割。 因为CSS的特殊命名风格…...
Flink基本原理 + WebUI说明 + 常见问题分析
Flink 概述 Flink 是一个用于进行大规模数据处理的开源框架,它提供了一个流式的数据处理 API,支持多种编程语言和运行时环境。Flink 的核心优点包括: 低延迟:Flink 可以在毫秒级的时间内处理数据,提供了低延迟的数据…...
3. 文档概述(Documentation Overview)
3. 文档概述(Documentation Overview) 本章节简要介绍一下Spring Boot参考文档。它包含本文档其它部分的链接。 本文档的最新版本可在 docs.spring.io/spring-boot/docs/current/reference/ 上获取。 3.1 第一步(First Steps) …...
【vue3 路由使用与讲解】vue-router : 简洁直观的全面介绍
# 核心内容介绍 路由跳转有两种方式: 声明式导航:<router-link :to"...">编程式导航:router.push(...) 或 router.replace(...) ;两者的规则完全一致。 push(to: RouteLocationRaw): Promise<NavigationFailur…...
ubuntu创建账号和samba共享目录
新建用于登录Ubuntu图形界面的用户 sudo su #切换为root用户获取管理员权限用于新建用户 adduser username #新建用户(例如用户名为username) adduser username sudo #将用户添加到 sudo 组 新建只能用于命令行下登录的用户 sudo su #切换为root用户…...
李沐动手学习深度学习——3.6练习
本节直接实现了基于数学定义softmax运算的softmax函数。这可能会导致什么问题?提示:尝试计算exp(50)的大小。 可能存在超过计算机最大64位的存储,导致精度溢出,影响最终计算结果。 本节中的函数cross_entropy是根据交叉熵损失函数…...
机器学习_10、集成学习-Bagging(自举汇聚法)
Bagging(自举汇聚法) Bagging(Bootstrap Aggregating,自举汇聚法)是一种集成学习方法,由Leo Breiman于1996年提出。它旨在通过结合多个模型来提高单个预测模型的稳定性和准确性。Bagging方法特别适用于减少…...
【力扣hot100】刷题笔记Day20
前言 今天学习了一句话“自己如果不努力,屎都吃不上热乎的”,话糙理不糙,与君共勉 35. 搜索插入位置 - 力扣(LeetCode) 二分查找 class Solution:def searchInsert(self, nums: List[int], target: int) -> int:n…...
Redis 之八:Jdeis API 的使用(Java 操作 Redis)
Jedis API 使用 Jedis 是 Redis 官方推荐的 Java 客户端,它提供了一套丰富的 API 来操作 Redis 服务器。通过 Jedis API,开发者可以方便地在 Java 应用程序中执行 Redis 的命令来实现数据的增删查改以及各种复杂的数据结构操作。 以下是一些基本的 Jedis…...
Docker 应用入门
一、Docker产生的意义 1‘解决环境配置难题:在软件开发中最大的麻烦事之一,就是环境配置。为了跑我们的程序需要装各种插件,操作系统差异、不同的版本插件都可能对程序产生影响。于是只能说:程序在我电脑上跑是正常的。 2’解决资…...
朱维群将出席用碳不排碳碳中和顶层科技路线设计开发
演讲嘉宾:朱维群 演讲题目:“用碳不排碳”碳中和顶层科技路线设计开发 简介 姓名:朱维群 性别:男 出生日期:1961-09-09 职称:教授 1998年毕业于大连理工大学精细化工国家重点实验室精细化工专业&#x…...
linux如何查看磁盘占用情况
要查看Linux系统中磁盘的占用情况,可以使用一些命令来获取相关信息。以下是一些常用的命令: df命令: df命令用于显示文件系统的磁盘空间使用情况,包括磁盘分区的总空间、已用空间、可用空间等信息。 df -h使用 -h 参数可以以人类可…...
【C++庖丁解牛】类与对象
📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 1.面向过程和面向对象…...
在什么时候企业档案才会发生调整
档案在企业中通常会调整在以下几个时刻: 1. 入职时:员工入职时,企业会要求员工提供个人档案,包括身份证件、学历证明、工作经历等相关文件。 2. 离职时:员工离职时,企业会整理员工的离职档案,包…...
Linux或Windows下判断socket连接状态
前言 场景:客户端程序需要实时知道和服务器的连接状态。比较通用的做法应用层是采用心跳机制,每隔一端时间发送心跳能回复说明服务器正常。 实际应用场景中,服务端和客户端并不是一家厂商的,比如说笔者这种情况,服务端…...
编译链接实战(25)gcc ASAN、MSAN检测内存越界、泄露、使用未初始化内存等内存相关错误
文章目录 1 ASAN1.1 介绍1.2 原理编译时插桩模块运行时库2 检测示例2.1 内存越界2.2 内存泄露内存泄露检测原理作用域外访问2.3 使用已经释放的内存2.4 将漏洞信息输出文件3 MSAN1 ASAN 1.1 介绍 -fsanitize=address是一个编译器选项,用于启用AddressSanitizer(地址...
[HackMyVM]靶场 VivifyTech
kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Unk…...
软考高级系统分析师:关联关系、依赖关系、实现关系和泛化关系概念和例题
一、AI 解读 关联关系、依赖关系、实现关系和泛化关系是面向对象设计中的四种基本关系。它们在类与类之间建立不同类型的联系,以反映对象间的相互作用、依赖和继承关系。下面我将使用表格的形式来解释这四种关系的概念和它们之间的区别: 关系类型概念特…...
设计模式学习笔记 - 面向对象 - 9.实践:如何进行面向对象分析、设计与编码
1.如何对接口鉴权这样一个功能开发做面向对象分析 本章会结合一个真实的案例,从基础的需求分析、职责划分、类的定义、交互、组装运行讲起,将最基础的面向对象分析(00A)、设计(00D)、编程(00P&…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
