UE5 C++ 单播 多播代理 动态多播代理

2024-02-28 14:36
文章标签 动态 c++ 代理 多播 ue5 单播

本文主要是介绍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++ 单播 多播代理 动态多播代理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/755774

相关文章

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑