一、前言
委托分单播和多播,多播就是可以绑定多个回调函数,然后一次性执行。这样也可以理解为啥多播没有返回值,多个回调函数执行后返回哪一个都是问题啊。而事件呢官方官方文档说法是“对于事件而言,只有定义事件的类才能调用 Broadcast()
函数”。这句话不是很理解,网上有解读是说事件的定义第一个参数就是类名,只有这个类可以调用后面的Broadcast()
函数,但我试了第一个参数是别的类也可以。
使用的虚幻版本为5.2.1,VS版本为2022.
二、实现
多播委托分为静态多播委托和动态多播委托,动态多播委托允许在蓝图中使用,静态不行。
2.1、静态多播委托
首先定义一个静态多播委托,如下,第一个参数为委托的名称,第二个为参数类型。
//多播委托类声明
DECLARE_MULTICAST_DELEGATE_OneParam(MulDelegate_OneParam, FString);//带一个参数的
然后,再声明委托的类型变量和绑定的方法
//多播代理声明
MulDelegate_OneParam MulDelegate_OneParam1;
//多播委托绑定函数定义
void MulDelegate_OneParamFunc1(FString strVal);
void MulDelegate_OneParamFunc2(FString strVal);
实现多播绑定函数,将读取到的信息打印到屏幕上。
void ADelegateActor::MulDelegate_OneParamFunc1(FString strVal)
{
FString tempStr = strVal.Append("1");
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Blue, FString::Printf(TEXT("%s"), *tempStr));
}
void ADelegateActor::MulDelegate_OneParamFunc2(FString strVal)
{
FString tempStr = strVal.Append("2");
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Blue, FString::Printf(TEXT("%s"), *tempStr));
}
绑定和执行
//多播代理的绑定
MulDelegate_OneParam1.AddUObject(this, &ADelegateActor::MulDelegate_OneParamFunc1);
MulDelegate_OneParam1.AddUObject(this, &ADelegateActor::MulDelegate_OneParamFunc2);
多播代理执行
MulDelegate_OneParam1.Broadcast("MulDelegate");
其他的方法可以参考单播委托的调用和使用。
2.2、动态多播委托
动态多播的声明,注意:名称一定要F开头不然会编译报错“Delegate type declarations must start with F”。
//动态多播委托,区别在于它可以暴露给蓝图,在蓝图中进行事件的绑定
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDynamicMulDelegate, FString, param);//一个参数的动态多播委托,名称一定要F开头不然会编译报错“Delegate type declarations must start with F”
动态多播的变量声明,要让蓝图中调用因此需要“UPROPERTY”标签。
//动态多播代理变量声明
UPROPERTY(BlueprintAssignable)//可以让代理在蓝图中进行绑定
FDynamicMulDelegate DynamicMulDelegate;
编译代码成功后,在编辑器中创建动态多播类的蓝图,然后在蓝图中输入上述定义的变量名点击“分配DynamicMulDelegate",这样就能创建一个带绑定的自定义蓝图事件,如图2.2.1所示,然后在开始函数时执行动态绑定。
调用还是再C++代码中
动态多播代理执行
DynamicMulDelegate.Broadcast("Dynamic Mul Cast");
2.3、事件
事件的声明,第一个参数是类名,我这里使用了其他的原始C++类(不继承任何虚幻类的类),第二个参数为事件的名称,第三个为参数类型。
//事件声明
DECLARE_EVENT_OneParam(MyRawClass, MyActionEvent1, FString);
定义事件的变量
//事件变量
MyActionEvent1 ActionEvent;
事件的绑定和执行
ActionEvent.AddUObject(this, &ADelegateActor::OneParamDelegateFunc);
ActionEvent.Broadcast("Event Call");
三、总结
3.1、动态多播委托的第一个参数名称必须以”F“开头,否则会编译报错。
3.2、事件和委托目前还未发现有什么不同之处,我定义事件时第一个参数为原始C++类,调用的时候在别的类也可以执行,跟官方说的不太一致。