一. 代理机制,代理也叫做委托,其作用就是提供一种消息机制。 发送方 ,接收方 分别叫做 触发点和执行点。就是软件中的观察者模式的原理。
创建一个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.效果如下: