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.效果如下:

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值