UE5 C++(十二)— 委托(代理)、多播委托

这里写目录标题

  • 介绍
    • 定义
    • 声明委托
    • 绑定委托
    • 执行委托
  • 单播委托
  • 多播委托
  • 动态多播代理

介绍

这个官网上有很详细介绍,这里介绍几个点

定义

委托 是一种泛型但类型安全的方式,可在C++对象上调用成员函数。可使用委托动态绑定到任意对象的成员函数,之后在该对象上调用函数,即使调用程序不知对象类型也可进行操作。复制委托对象很安全。你也可以利用值传递委托,但这样操作需要在堆上分配内存,因此通常并不推荐。请尽量通过引用传递委托

声明委托

在这里插入图片描述

UDELEGATE(BlueprintAuthorityOnly)
DECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams(FInstigatedAnyDamageSignature, float, Damage, const UDamageType*, DamageType, AActor*, DamagedActor, AActor*, DamageCauser);

绑定委托

在这里插入图片描述

MyDelegate.BindRaw( &MyFunction, true, 20 );

执行委托

在这里插入图片描述

WriteToLogDelegate.Execute(TEXT("Delegates are great!"));

单播委托

单播委托 只能绑定一个函数

创建一个C++类 MyDelegateActor

MyDelegateActor.h


#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyDelegateActor.generated.h"DECLARE_DELEGATE(NoParamDelegate);//声明一个无参委托
DECLARE_DELEGATE_OneParam(OneParamDelegate, int32);//声明一个有一个int32参数的委托
DECLARE_DELEGATE_TwoParams(TwoParamsDelegate, int32, FString);//声明一个有一个int32参数和一个FString参数的委托
DECLARE_DELEGATE_RetVal(int32, RetValDelegate);//声明一个有返回值的委托UCLASS()
class DEMO_API AMyDelegateActor : public AActor
{GENERATED_BODY()public:	// Sets default values for this actor's propertiesAMyDelegateActor();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:	// Called every framevirtual void Tick(float DeltaTime) override;NoParamDelegate NoParamDelegate;//声明一个无参委托OneParamDelegate OneParamDelegate;//声明一个有一个int32参数的委托TwoParamsDelegate TwoParamsDelegate;//声明一个有一个int32参数和一个FString参数的委托RetValDelegate RetValDelegate;//声明一个有返回值的委托void NoParamDelegateFunc();//无参委托函数void OneParamDelegateFunc(int32 Param);//有一个int32参数的委托函数void TwoParamsDelegateFunc(int32 Param1, FString Param2);//有一个int32参数和一个FString参数的委托函数int32 RetValDelegateFunc();//有返回值的委托函数};

MyDelegateActor.cpp


#include "MyDelegateActor.h"// Sets default values
AMyDelegateActor::AMyDelegateActor()
{// 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;NoParamDelegate.BindUObject(this, &AMyDelegateActor::NoParamDelegateFunc);	   // 绑定无参委托函数OneParamDelegate.BindUObject(this, &AMyDelegateActor::OneParamDelegateFunc);   // 绑定有一个int32参数的委托函数TwoParamsDelegate.BindUObject(this, &AMyDelegateActor::TwoParamsDelegateFunc); // 绑定有一个int32参数和一个FString参数的委托函数RetValDelegate.BindUObject(this, &AMyDelegateActor::RetValDelegateFunc);	   // 绑定有返回值的委托函数
}// Called when the game starts or when spawned
void AMyDelegateActor::BeginPlay()
{Super::BeginPlay();NoParamDelegate.Execute(); // 执行无参委托函数OneParamDelegate.Execute(1); // 执行有一个int32参数的委托函数TwoParamsDelegate.Execute(1, TEXT("TwoParamsDelegate")); // 执行有一个int32参数和一个FString参数的委托函数int32 RetVal = RetValDelegate.Execute(); // 执行有返回值的委托函数UE_LOG(LogTemp, Warning, TEXT("RetVal:%d"), RetVal);}// Called every frame
void AMyDelegateActor::Tick(float DeltaTime)
{Super::Tick(DeltaTime);
}
void AMyDelegateActor::NoParamDelegateFunc()
{UE_LOG(LogTemp, Warning, TEXT("NoParamDelegateFunc"));
}
void AMyDelegateActor::OneParamDelegateFunc(int32 Param)
{UE_LOG(LogTemp, Warning, TEXT("OneParamDelegateFunc Param:%d"), Param);
}
void AMyDelegateActor::TwoParamsDelegateFunc(int32 Param1, FString Param2)
{UE_LOG(LogTemp, Warning, TEXT("TwoParamsDelegateFunc Param1:%d Param2:%s"), Param1, *Param2);
}
int32 AMyDelegateActor::RetValDelegateFunc()
{UE_LOG(LogTemp, Warning, TEXT("RetValDelegateFunc"));return 1;
}

然后把C++类 MyDelegateActor 拖到场景中,运行
在这里插入图片描述
在这里插入图片描述

多播委托

多播委托(代理) 可以绑定绑定多个函数

创建一个C++类 MyDelegateActor

MyDelegateActor.h

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyDelegateActor.generated.h"// 多播委托代理
DECLARE_MULTICAST_DELEGATE(NoParamMulticastDelegate);							  // 声明一个无参多播委托
DECLARE_MULTICAST_DELEGATE_OneParam(OneParamMulticastDelegate, int32);			  // 声明一个有一个int32参数的多播委托
DECLARE_MULTICAST_DELEGATE_TwoParams(TwoParamsMulticastDelegate, int32, FString); // 声明一个有一个int32参数和一个FString参数的多播委托UCLASS()
class DEMO_API AMyDelegateActor : public AActor
{GENERATED_BODY()public:// Sets default values for this actor's propertiesAMyDelegateActor();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:// Called every framevirtual void Tick(float DeltaTime) override;/*****     多播委托代理         ******/NoParamMulticastDelegate NoParamMulticastDelegate;	 // 声明一个无参多播委托OneParamMulticastDelegate OneParamMulticastDelegate;	 // 声明一个有一个int32参数的多播委托TwoParamsMulticastDelegate TwoParamsMulticastDelegate; // 声明一个有一个int32参数和一个FString参数的多播委托void NoParamMulticastDelegateFunc();					 // 无参多播委托函数void NoParamMulticastDelegateFunc2();void OneParamMulticastDelegateFunc(int32 Param);		 // 有一个int32参数的多播委托函数void OneParamMulticastDelegateFunc2(int32 Param);void TwoParamsMulticastDelegateFunc(int32 Param1, FString Param2); // 有一个int32参数和一个FString参数的多播委托函数void TwoParamsMulticastDelegateFunc2(int32 Param1, FString Param2); };

MyDelegateActor.cpp

// Fill out your copyright notice in the Description page of Project Settings.#include "MyDelegateActor.h"// Sets default values
AMyDelegateActor::AMyDelegateActor()
{// 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;/*****     多播委托代理         ******/NoParamMulticastDelegate.AddUObject(this, &AMyDelegateActor::NoParamMulticastDelegateFunc); // 绑定无参多播委托函数NoParamMulticastDelegate.AddUObject(this, &AMyDelegateActor::NoParamMulticastDelegateFunc2);OneParamMulticastDelegate.AddUObject(this, &AMyDelegateActor::OneParamMulticastDelegateFunc); // 绑定有一个int32参数的多播委托函数OneParamMulticastDelegate.AddUObject(this, &AMyDelegateActor::OneParamMulticastDelegateFunc2);TwoParamsMulticastDelegate.AddUObject(this, &AMyDelegateActor::TwoParamsMulticastDelegateFunc); // 绑定有一个int32参数和一个FString参数的多播委托函数TwoParamsMulticastDelegate.AddUObject(this, &AMyDelegateActor::TwoParamsMulticastDelegateFunc2);
}// Called when the game starts or when spawned
void AMyDelegateActor::BeginPlay()
{Super::BeginPlay();/*****     多播委托代理         ******/NoParamMulticastDelegate.Broadcast();								// 执行无参多播委托函数OneParamMulticastDelegate.Broadcast(1);								// 执行有一个int32参数的多播委托函数TwoParamsMulticastDelegate.Broadcast(1, TEXT("TwoParamsDelegate")); // 执行有一个int32参数和一个FString参数的多播委托函数
}// Called every frame
void AMyDelegateActor::Tick(float DeltaTime)
{Super::Tick(DeltaTime);
}/*****     多播委托代理         ******/
void AMyDelegateActor::NoParamMulticastDelegateFunc()
{UE_LOG(LogTemp, Warning, TEXT("NoParamMulticastDelegateFunc"));
}
void AMyDelegateActor::NoParamMulticastDelegateFunc2()
{UE_LOG(LogTemp, Warning, TEXT("NoParamMulticastDelegateFunc2"));
}
void AMyDelegateActor::OneParamMulticastDelegateFunc(int32 Param)
{UE_LOG(LogTemp, Warning, TEXT("OneParamMulticastDelegateFunc Param:%d"), Param);
}
void AMyDelegateActor::OneParamMulticastDelegateFunc2(int32 Param)
{UE_LOG(LogTemp, Warning, TEXT("OneParamMulticastDelegateFunc2 Param:%d"), Param);
}
void AMyDelegateActor::TwoParamsMulticastDelegateFunc(int32 Param1, FString Param2)
{UE_LOG(LogTemp, Warning, TEXT("TwoParamsMulticastDelegateFunc Param1:%d Param2:%s"), Param1, *Param2);
}
void AMyDelegateActor::TwoParamsMulticastDelegateFunc2(int32 Param1, FString Param2)
{UE_LOG(LogTemp, Warning, TEXT("TwoParamsMulticastDelegateFunc2 Param1:%d Param2:%s"), Param1, *Param2);
}

打印日志
在这里插入图片描述

动态多播代理

动态多播委托代理 区别在于可以暴露给蓝图,在蓝图中进行事件绑定, 一定要是F开头
还有就是参数和参数名一定要配合使用

创建一个C++类 MyDelegateActor

MyDelegateActor.h

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyDelegateActor.generated.h"// 动态多播委托代理 区别在于可以暴露给蓝图,在蓝图中进行事件绑定, 一定要是F开头
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FNoParamDynamicMulticastDelegate);												  // 声明一个无参多播委托
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOneParamDynamicMulticastDelegate, FString, ParamStr);					  // 声明一个有一个int32参数的多播委托
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FTwoParamsDynamicMulticastDelegate, int32, ParamInt, FString, ParamStr); // 声明一个有一个int32参数和一个FString参数的多播委托UCLASS()
class DEMO_API AMyDelegateActor : public AActor
{GENERATED_BODY()public:// Sets default values for this actor's propertiesAMyDelegateActor();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:// Called every framevirtual void Tick(float DeltaTime) override;/*****     动态多播委托代理         ******/UPROPERTY(BlueprintAssignable, Category = "MyDelegate")FNoParamDynamicMulticastDelegate NoParamDynamicMulticastDelegate; // 声明一个无参多播委托UPROPERTY(BlueprintAssignable, Category = "MyDelegate")FOneParamDynamicMulticastDelegate OneParamDynamicMulticastDelegate; // 声明一个有一个int32参数的多播委托UPROPERTY(BlueprintAssignable, Category = "MyDelegate")FTwoParamsDynamicMulticastDelegate TwoParamsDynamicMulticastDelegate; // 声明一个有一个int32参数和一个FString参数的多播委托
};

MyDelegateActor.cpp

// Fill out your copyright notice in the Description page of Project Settings.#include "MyDelegateActor.h"// Sets default values
AMyDelegateActor::AMyDelegateActor()
{// 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 AMyDelegateActor::BeginPlay()
{Super::BeginPlay();/*****     执行动态多播委托代理         ******/NoParamDynamicMulticastDelegate.Broadcast();OneParamDynamicMulticastDelegate.Broadcast(TEXT("OneParamsDelegate"));TwoParamsDynamicMulticastDelegate.Broadcast(1, TEXT("TwoParamsDelegate"));
}// Called every frame
void AMyDelegateActor::Tick(float DeltaTime)
{Super::Tick(DeltaTime);
}

编译之后,创建蓝图类BP_MyDelegateActor

在蓝图中实现

在这里插入图片描述
打印日志
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

爬虫基础一(持续更新)

爬虫概念: 通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程 分类: 1,通用爬虫:抓取一整张页面数据 2,聚焦爬虫:抓取页面中的局部内容 3,增量式爬虫&…

星穹铁道1.5版本活动【狐斋志异】,有哪些有趣故事和彩蛋

狐斋志异算是玩梗集大成者,加上剧情内补全了一些故事设定。版本活动名称【狐斋志异】致敬的是清朝小说家蒲松龄创作的《聊斋志异》。聊斋志异被国人所熟悉的莫过于里面的鬼怪故事,因此又称为《鬼狐传》。 这次【狐斋志异】开拓任务也是围绕着开拓者去十王…

鸿鹄电子招投标系统:源码级别解析电子招投标的精髓

招投标管理系统是一个集门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理于一体的综合性应用平台。它适用于招标代理、政府采购、企业采购和工程交易等业务的企业,旨在提高项目管理的效率和质量。该系…

Java后端开发——Ajax、jQuery和JSON

Java后端开发——Ajax、jQuery和JSON 概述 Ajax全称是Asynchronous Javascript and XML,即异步的JavaScript和 XML。Ajax是一种Web应用技术,该技术是在JavaScript、DOM、服务器配合下,实现浏览器向服务器发送异步请求。 Ajax异步请求方式不…

Docker中镜像的相关操作

1.辅助操作 docker version:用查看docker客户端引擎和server端引擎版本信息。 docker info:用来查看docker引擎的详细信息。 docker --help:用来查看帮助信息。 2.镜像Image docker images:查看当前本地仓库中存在哪些镜像。 …

速通C语言第十二站 文件操作

系列文章目录 速通C语言系列 速通C语言第一站 一篇博客带你初识C语言 http://t.csdn.cn/N57xl 速通C语言第二站 一篇博客带你搞定分支循环 http://t.csdn.cn/Uwn7W 速通C语言第三站 一篇博客带你搞定函数 http://t.csdn.cn/bfrUM 速通C语言第四站 一篇博客带…

Java重修第一天—学习数组

1. 认识数组 建议1.5倍速学习,并且关闭弹幕。 数组的定义:数组是一个容器,用来存储一批同种类型的数据。 下述图:是生成数字数组和字符串数组。 为什么有了变量还需要定义数组呢?为了解决在某些场景下,变…

ORACLE Primavera Unifier v23.12 最新虚拟机(VM)分享下载

引言 根据上周的计划,我近日简单制作了一个基于ORACLE Primavera Unifier 最新版23.12的虚拟机演示环境,里面包括了unifier的全套系统服务 此虚拟系统环境仅用于演示、培训和测试目的。如要在生产环境中使用此虚拟机,请您与Oracle 销售代表联…

知虾电商(Shopee):东南亚领先电商平台的十大关键特点**

知虾电商(Shopee)作为东南亚地区领先的电子商务平台,由Sea Group(前称Garena)在2015年创立。知虾电商以移动优先的策略迅速崛起,为用户提供了一个便捷、安全的在线购物环境。以下是知虾电商的一些关键特点&…

服务器执行rm命令时自动记录到审计日志中

目的 当在服务器上执行类似于 rm 命令时,自动记录该命令执行的时间,在哪里执行的,删除的什么文件,记录到审计日志中,能够查找到某些文件丢失原因 配置 # 需要root权限,sudo不行,这里假设执行…

RocketMQ5-01云原生和AI演变下的架构重构

2022年9月22日,迎来 RocketMQ5 的发版,距离 2017 发布的 4.X 时代,RocketMQ 迎来 5.X 时代。 RocketMQ 4.X 时代已经使众多开发者和项目受益,但是随着关注度、使用量逐步上升以及云原生时代的到来,也对其自身架构带来…

计算机网络课程设计-企业网三层架构

(单人版) 摘 要 本篇报告主要解决了为一家名为西宫的公司网络搭建问题,该网络采用企业网三层架构对完了过进行设计。首先使用以太网中继,主要使用VLAN划分的技术来划定不同部门。使用MSTP对每个组配置生成树,防止交换机…

【软件测试】2024年准备中/高级测试岗技术面试...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、软件测试基础知…

Unity中URP下统一不同平台下的z值

文章目录 前言一、ComputeFogFactor 来计算雾效混合因子二、UNITY_Z_0_FAR_FROM_CLIPSPACE 来统一计算不同平台下的Z值1、DirectX平台2、GL平台下(在Unity.2022.LTS下,该功能没有完善)3、Opengl下 前言 在之前的文章中,我们实现了URP下的雾效…

天津最新web前端培训班 如何提升web技能?

随着互联网的迅猛发展,web前端成为了一个热门的职业方向。越来越多的人希望能够通过学习web前端技术来提升自己的就业竞争力。为了满足市场的需求,许多培训机构纷纷推出了web前端培训课程。 什么是WEB前端 web前端就是web给用户展示的东西,…

python+selenium爬虫笔记

本文只是做例子,具体网站路径麻烦你们换下,还有xpath路径也换下 一、安装所需要的组件(此处采用谷歌) 1、安装驱动 查看你的浏览器版本,去安装对应的版本 下载驱动 下载驱动路径 之前版本的 输入这个路径下载下来解压…

【Bootstrap5学习 day12】

Bootstrap5 导航 Bootstrap5提供了一种简单快捷的方法来创建基本导航,它提供了非常灵活和优雅的选项卡和Pills等组件。Bootstrap5的所有导航组件,包括选项卡和Pillss,都通过基本的.nav类共享相同的基本标记和样式。 创建基本导航 要创建简单…

亚马逊店铺遇到账号申诉模版分享

1.表达诚意,先认错再说:我知道,最近我们在Amazon.com上作为卖家的表现已经低于亚马逊和我们自己的质量标准。 2.清楚分明的格式:我们库存管理的混乱导致了延迟发货,更糟糕的是,物品无法使用。当延迟发货和…

对话新七天创始人&CEO左英杰:品牌直播电商出圈“五步法”

整理 | 飞族 编辑 | 渔舟 出品|极新&北京电子商务协会 AI、AIGC、VR等数智化新技术发展日新月异,在直播电商领域的应用和探索逐渐深入,从内容生成、创意优化、购物体验、智能客服、精准营销等方面提供全方位全链路的赋能&#…

内网穿透的应用-使用Docker本地部署可编辑导航页结合内网穿透实现远程访问

文章目录 1. 使用Docker搜索镜像2. 下载镜像3. 查看镜像4. 启动容器5. 浏览器访问6. 远程访问6.1 内网穿透工具安装6.2 创建远程连接公网地址6.3 使用固定二级子域名地址远程访问 今天和大家分享如何使用Docker本地部署一个开源的简约风格网址导航页,支持五种搜索引…