当前位置: 首页 > news >正文

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 : 简洁直观的全面介绍

# 核心内容介绍 路由跳转有两种方式&#xff1a; 声明式导航&#xff1a;<router-link :to"...">编程式导航&#xff1a;router.push(...) 或 router.replace(...) &#xff1b;两者的规则完全一致。 push(to: RouteLocationRaw): Promise<NavigationFailur…...

ubuntu创建账号和samba共享目录

新建用于登录Ubuntu图形界面的用户 sudo su #切换为root用户获取管理员权限用于新建用户 adduser username #新建用户&#xff08;例如用户名为username&#xff09; adduser username sudo #将用户添加到 sudo 组 新建只能用于命令行下登录的用户 sudo su #切换为root用户…...

李沐动手学习深度学习——3.6练习

本节直接实现了基于数学定义softmax运算的softmax函数。这可能会导致什么问题&#xff1f;提示&#xff1a;尝试计算exp(50)的大小。 可能存在超过计算机最大64位的存储&#xff0c;导致精度溢出&#xff0c;影响最终计算结果。 本节中的函数cross_entropy是根据交叉熵损失函数…...

机器学习_10、集成学习-Bagging(自举汇聚法)

Bagging&#xff08;自举汇聚法&#xff09; Bagging&#xff08;Bootstrap Aggregating&#xff0c;自举汇聚法&#xff09;是一种集成学习方法&#xff0c;由Leo Breiman于1996年提出。它旨在通过结合多个模型来提高单个预测模型的稳定性和准确性。Bagging方法特别适用于减少…...

【力扣hot100】刷题笔记Day20

前言 今天学习了一句话“自己如果不努力&#xff0c;屎都吃不上热乎的”&#xff0c;话糙理不糙&#xff0c;与君共勉 35. 搜索插入位置 - 力扣&#xff08;LeetCode&#xff09; 二分查找 class Solution:def searchInsert(self, nums: List[int], target: int) -> int:n…...

Redis 之八:Jdeis API 的使用(Java 操作 Redis)

Jedis API 使用 Jedis 是 Redis 官方推荐的 Java 客户端&#xff0c;它提供了一套丰富的 API 来操作 Redis 服务器。通过 Jedis API&#xff0c;开发者可以方便地在 Java 应用程序中执行 Redis 的命令来实现数据的增删查改以及各种复杂的数据结构操作。 以下是一些基本的 Jedis…...

Docker 应用入门

一、Docker产生的意义 1‘解决环境配置难题&#xff1a;在软件开发中最大的麻烦事之一&#xff0c;就是环境配置。为了跑我们的程序需要装各种插件&#xff0c;操作系统差异、不同的版本插件都可能对程序产生影响。于是只能说&#xff1a;程序在我电脑上跑是正常的。 2’解决资…...

朱维群将出席用碳不排碳碳中和顶层科技路线设计开发

演讲嘉宾&#xff1a;朱维群 演讲题目&#xff1a;“用碳不排碳”碳中和顶层科技路线设计开发 简介 姓名&#xff1a;朱维群 性别&#xff1a;男 出生日期&#xff1a;1961-09-09 职称&#xff1a;教授 1998年毕业于大连理工大学精细化工国家重点实验室精细化工专业&#x…...

linux如何查看磁盘占用情况

要查看Linux系统中磁盘的占用情况&#xff0c;可以使用一些命令来获取相关信息。以下是一些常用的命令&#xff1a; df命令&#xff1a; df命令用于显示文件系统的磁盘空间使用情况&#xff0c;包括磁盘分区的总空间、已用空间、可用空间等信息。 df -h使用 -h 参数可以以人类可…...

【C++庖丁解牛】类与对象

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.面向过程和面向对象…...

在什么时候企业档案才会发生调整

档案在企业中通常会调整在以下几个时刻&#xff1a; 1. 入职时&#xff1a;员工入职时&#xff0c;企业会要求员工提供个人档案&#xff0c;包括身份证件、学历证明、工作经历等相关文件。 2. 离职时&#xff1a;员工离职时&#xff0c;企业会整理员工的离职档案&#xff0c;包…...

Linux或Windows下判断socket连接状态

前言 场景&#xff1a;客户端程序需要实时知道和服务器的连接状态。比较通用的做法应用层是采用心跳机制&#xff0c;每隔一端时间发送心跳能回复说明服务器正常。 实际应用场景中&#xff0c;服务端和客户端并不是一家厂商的&#xff0c;比如说笔者这种情况&#xff0c;服务端…...

编译链接实战(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 解读 关联关系、依赖关系、实现关系和泛化关系是面向对象设计中的四种基本关系。它们在类与类之间建立不同类型的联系&#xff0c;以反映对象间的相互作用、依赖和继承关系。下面我将使用表格的形式来解释这四种关系的概念和它们之间的区别&#xff1a; 关系类型概念特…...

设计模式学习笔记 - 面向对象 - 9.实践:如何进行面向对象分析、设计与编码

1.如何对接口鉴权这样一个功能开发做面向对象分析 本章会结合一个真实的案例&#xff0c;从基础的需求分析、职责划分、类的定义、交互、组装运行讲起&#xff0c;将最基础的面向对象分析&#xff08;00A&#xff09;、设计&#xff08;00D&#xff09;、编程&#xff08;00P&…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

解析“道作为序位生成器”的核心原理

解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制&#xff0c;重点解析"道作为序位生成器"的核心原理与实现框架&#xff1a; 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...