UE5--浅析委托原理(Delegate)

委托概述

委托是一种用于事件处理的机制。通过使用委托,可以将一个或多个函数绑定到一个事件上,在事件触发时自动调用这些函数。代理也叫做委托,比如:跳,跑,开枪,伤害等响应,就是注册一个委托回调,其作用就是提供一种消息机制,都知道消息的传递需要发送方和接收方,而代理的过程也可分为这两大部分,我们可以换个名字分别叫做:触发点和执行点,这就是代理的主要部分,记住这个两个点就能记住代理原理。这里面也有很多的类型擦除,类型还原,还有函数签名转换。

委托种类

在这里插入图片描述

委托的使用

三个步骤:

1.声明委托代理

2.绑定函数到代理上

3.代理的调用

单播

DECLARE_DELEGATE( FSimpleDelegate ); // 无参、无返回值
DECLARE_DELEGATE_OneParam(FPakEncryptionKeyDelegate, uint8[32]); // 1个参数、无返回值
DECLARE_DELEGATE_TwoParams(FPakSigningKeysDelegate, TArray<uint8>&, TArray<uint8>&); // 2个参数、无返回值
DECLARE_DELEGATE_RetVal_ThreeParams(bool, FOnMountPak, const FString&, int32, IPlatformFile::FDirectoryVisitor*); // 3个参数、bool返回

声明定义单播可以有参数和无参数

单播代理委托,指的是只能绑定一个函数指针的委托,实现一对一的通知。

单播调用方式为 ExecuteIfBound()

单播删除方式为 Unbind()

单播绑定方法为 Bind…(如 BindStatic,BindRaw,BindUObject等)

多播

//多播委托
DECLARE_MULTICAST_DELEGATE(DelegateName);
DECLARE_MULTICAST_DELEGATE_ONEPARAM(DelegateName, Param1Type);
DECLARE_MULTICAST_DELEGATE_XXXPARAMS(DelegateName, Param1Type,...);

多播代理委托,指的是能绑定多个函数指针的委托,实现一对多的通知。

多播调用方式为 BroadCast()

多播的删除方式为 Remove(),RemoveAll()

多播绑定方式为 Add…(如 AddUObject…);

注意

1.只要动态多播才可以被蓝图绑定,通过宏定义BlueprintAsignable

2.看是否有返回值,通过关键字“RetVal”,只有单播委托和动态单播委托,才有返回值。

3.多播委托和单播委托都支持多参数传入,最多9个参数

4.委托的开头必须用F,否则无法编译

5.动态委托可以序列化,通过名称查找函数。

动态委托案例

下面是我用来学习动态委托的一个小案例,让自己更清楚的看见委托的使用与过程

新建两个C++对象
在这里插入图片描述
然后拖入场景,一下是两个Actor的代码

MyActorA

.h

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActorA.generated.h"/*
* 让A进行对B的调用,我们就需要在A中声明委托类型
* 我们这里测试动态多播参数
* 必须使用F开头的
*/
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDongTaiDuoBo,bool,OkorNotOk);UCLASS()
class HOTREPLACE_API AMyActorA : public AActor
{GENERATED_BODY()public:	// Sets default values for this actor's propertiesAMyActorA();UPROPERTY(BlueprintAssignable)FDongTaiDuoBo DongTaiDuoBo;protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:	// Called every framevirtual void Tick(float DeltaTime) override;//用来执行触发委托UFUNCTION(BlueprintCallable)void execute(bool ifSuccess);};

.cpp

// Fill out your copyright notice in the Description page of Project Settings.#include "MyActorA.h"// Sets default values
AMyActorA::AMyActorA()
{// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;}// Called when the game starts or when spawned
void AMyActorA::BeginPlay()
{Super::BeginPlay();}// Called every frame
void AMyActorA::Tick(float DeltaTime)
{Super::Tick(DeltaTime);}void AMyActorA::execute(bool ifSuccess)
{//这里用来触发委托DongTaiDuoBo.Broadcast(ifSuccess);
}

MyActorB

.h

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActorB.generated.h"UCLASS()
class HOTREPLACE_API AMyActorB : public AActor
{GENERATED_BODY()public:	// Sets default values for this actor's propertiesAMyActorB();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:	// Called every framevirtual void Tick(float DeltaTime) override;/** 这里来调用A里面的委托* 现在写一个被委托的函数*/UFUNCTION(BlueprintCallable)void Bexecute(bool ifSuccess);
};

.cpp

// Fill out your copyright notice in the Description page of Project Settings.#include "MyActorB.h"
#include "MyActorA.h"
#include "Kismet\GameplayStatics.h"
// Sets default values
AMyActorB::AMyActorB()
{// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;}// Called when the game starts or when spawned
void AMyActorB::BeginPlay()
{Super::BeginPlay();/** 在场景中寻找A*/TArray<AActor*>Actors;UGameplayStatics::GetAllActorsOfClass(GetWorld(),AMyActorA::StaticClass(),Actors);//在场景中遍历到我我们需要的ActorB,然后把函数绑定到ActorB上面for (auto Actor : Actors){AMyActorA* A=Cast<AMyActorA>(Actor);if (A!=nullptr){//把找到的AActor转换成A需要的类A->DongTaiDuoBo.AddDynamic(this,&AMyActorB::Bexecute);}}
}// Called every frame
void AMyActorB::Tick(float DeltaTime)
{Super::Tick(DeltaTime);}void AMyActorB::Bexecute(bool ifSuccess)
{if (ifSuccess){UE_LOG(LogTemp,Warning,TEXT("Success"));}else {UE_LOG(LogTemp, Warning, TEXT("NotSuccessnnnnnn"));}}

在关卡蓝图中,进行连连看
在这里插入图片描述
MyActorA
在这里插入图片描述
测试结果
在这里插入图片描述
之后你就会发现我们的动态委托测试成功了。

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

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

相关文章

ABP框架9——自定义拦截器的实现与使用

一、AOP编程 AOP定义:面向切片编程&#xff0c;着重强调功能&#xff0c;将功能从业务逻辑分离出来。AOP使用场景&#xff1a;处理通用的、与业务逻辑无关的功能&#xff08;如日志记录、性能监控、事务管理等&#xff09;拦截器:拦截方法调用并添加额外的行为&#xff0c;比如…

【JavaScript】this 指向由入门到精通

this 的概念 this 在JavaScript 及其其他面向对象的编程语言中&#xff0c;存在的目的是为了提供一种在对象方法中引用当前对象的方式。 它为方法提供了对当前实例的引用&#xff0c;使得方法能够访问或者修改实例的成员变量。 注意点&#xff1a; this 的绑定和定位的位置…

JavaScript完整版知识体系(持续更新~~)

一、Variables变量 (1)变量的声明方式。 在 JavaScript 中&#xff0c;let、const 和 var 是用于声明变量的关键字&#xff0c;但它们在作用域、可变性、以及提升&#xff08;Hoisting&#xff09;行为上有所不同。下面是对这三者的详细解释&#xff1a; 1. var: 作用域&…

git fetch和git pull 的区别

git pull 实际上就是 fetch merge 的缩写, git pull 唯一关注的是提交最终合并到哪里&#xff08;也就是为 git fetch 所提供的 destination 参数&#xff09; git fetch 从远程仓库下载本地仓库中缺失的提交记录,并更新远程分支指针 git pull抓取更新再合并到本地分支,相当于…

SQL Server查询计划操作符(7.3)——查询计划相关操作符(6)

7.3. 查询计划相关操作符 48)Key Lookup:该操作符对一个有簇索引的表进行书签查找。参数列包含簇索引的名字和用于查找簇索引中数据行的簇键。该操作符总是伴随一个Nested Loops操作符。如果其参数列中出现WITH PREFETCH子句,则查询处理器已决定使用异步预取(预读,read-ah…

Python Pandas(5):Pandas Excel 文件操作

Pandas 提供了丰富的 Excel 文件操作功能&#xff0c;帮助我们方便地读取和写入 .xls 和 .xlsx 文件&#xff0c;支持多表单、索引、列选择等复杂操作&#xff0c;是数据分析中必备的工具。 操作方法说明读取 Excel 文件pd.read_excel()读取 Excel 文件&#xff0c;返回 DataF…

如何在Android Studio中开发一个简单的Android应用?

Android Studio是开发Android应用的官方集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了许多强大的功能&#xff0c;使得开发者能够高效地创建Android应用。如果你是Android开发的初学者&#xff0c;本文将引导你如何在Android Studio中开发一个简单的Android应用…

使用 JFreeChart 创建动态图表:从入门到实战

文章目录 前言一、JFreeChart 简介二、环境准备三、 创建第一个折线图四、自定义图表样式4.1 设置背景色4.2 设置折线颜色4.3 设置字体&#xff08;解决中文乱码&#xff09;4.4 设置横坐标的标签宽度和方向 五、导出图表六、实战&#xff1a;动态生成日报图表总结 前言 在数据…

Formality:探针(Probe Point)的设置与使用

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 一般情况下&#xff0c;verify命令会对参考设计和实现设计所有匹配的比较点各自进行验证&#xff0c;但有些时候为了调试&#xff0c;可能需要验证参考设计和实现设…

idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡

idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡 问题 idea编译器 安装copilot AI工具 实际操作 在 IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤如下&#xff1a; 打开 IntelliJ IDEA&#xff1a; 打开你的 IntelliJ IDEA 应用…

【计算机网络】TCP/IP 网络模型有哪几层?

目录 应用层 传输层 网络层 网络接口层 总结 为什么要有 TCP/IP 网络模型&#xff1f; 对于同一台设备上的进程间通信&#xff0c;有很多种方式&#xff0c;比如有管道、消息队列、共享内存、信号等方式&#xff0c;而对于不同设备上的进程间通信&#xff0c;就需要网络通…

(done) openMP学习 (Day10: Tasks 原语)

url: https://dazuozcy.github.io/posts/introdution-to-openmp-intel/#19-%E6%8A%80%E8%83%BD%E8%AE%AD%E7%BB%83%E9%93%BE%E8%A1%A8%E5%92%8Copenmp 本章节内容仅提供引入&#xff0c;关于 task 更详细的细节请看 openMP 手册或者源材料 Day9 介绍了一个优化链表遍历的粗糙方…

《代码随想录第二十八天》——回溯算法理论基础、组合问题、组合总和III、电话号码的字母组合

《代码随想录第二十八天》——回溯算法理论基础、组合问题、组合总和III、电话号码的字母组合 本篇文章的所有内容仅基于C撰写。 1. 基础知识 1.1 概念 回溯是递归的副产品&#xff0c;它也是遍历树的一种方式&#xff0c;其本质是穷举。它并不高效&#xff0c;但是比暴力循…

群晖安装Gitea

安装Docker Docker运行Gitea 上传gitea包&#xff0c;下载地址&#xff1a;https://download.csdn.net/download/hmxm6/90360455 打开docker 点击印象&#xff0c;点击新增&#xff0c;从文件添加 点击启动 可根据情况&#xff0c;进行高级设置&#xff0c;没有就下一步 点击应…

SAP ABAP调用DeepSeek API大模型接口

搜索了一下DeepSeek&#xff0c;发现有人已经实现了SAP的对接&#xff0c; 不登录网页&#xff0c;SAP如何使用DeepSeek快速编程&#xff0c;ABAP起飞啦~ 按照对应的注册流程和方法。总算做出了第一个能够直连DeepSeek的API abap程序。 效果不错。 report ZTOOL_ABAP_CALL_D…

verilog练习:i2c slave 模块设计

文章目录 前言1. 结构2.代码2.1 iic_slave.v2.2 sync.v2.3 wr_fsm.v2.3.1 状态机状态解释 2.4 ram.v 3. 波形展示4. 建议5. 资料总结 前言 首先就不啰嗦iic协议了&#xff0c;网上有不少资料都是叙述此协议的。 下面将是我本次设计的一些局部设计汇总&#xff0c;如果对读者有…

活动预告 |【Part 1】Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁

课程介绍 通过 Microsoft Learn 免费参加 Microsoft 安全在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft Cloud 技术的了解。参加我们举办的“通过扩展检测和响应抵御威胁”技术公开课活动&#xff0c;了解如何更好地在 Microsoft 365 Defen…

【电机控制器】STC8H1K芯片——低功耗

【电机控制器】STC8H1K芯片——低功耗 文章目录 [TOC](文章目录) 前言一、芯片手册说明二、IDLE模式三、PD模式四、PD模式唤醒五、实验验证1.接线2.视频&#xff08;待填&#xff09; 六、参考资料总结 前言 使用工具&#xff1a; 1.STC仿真器烧录器 提示&#xff1a;以下是本…

校园网规划方案

个人博客站—运维鹿: http://www.kervin24.top CSDN博客—做个超努力的小奚&#xff1a; https://blog.csdn.net/qq_52914969?typeblog 本课程设计参考学习计算机网络 思科Cisco Packet Tracer仿真实验_哔哩哔哩_bilibili, 文章和pkg详见个人博客站: http://www.kervin24.to…

用 DeepSeek + Kimi 自动做 PPT,效率起飞

以下是使用 DeepSeek Kimi 自动做 PPT 的详细操作步骤&#xff1a; 利用 DeepSeek 生成 PPT 内容&#xff1a; 访问 DeepSeek 官网&#xff0c;完成注册/登录后进入对话界面。输入指令&#xff0c;例如“请用 Markdown 格式生成一份关于[具体主题]的 PPT 大纲&#xff0c;需包…