代理和函数传递
1.代理与蓝图交互
用于与蓝图交互的代理只能是动态多播代理。
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMyMuitDynamicDele, FString, str);
代理的定义:
//委托变量,需要用BlueprintAssignable修饰
UPROPERTY(BlueprintAssignable,Category=“Dele”)
FMyMuitDynamicDele MyMuitDynamicDele;
可以在蓝图里面绑定函数,解除所有绑定函数等。但是执行代理, 还是需要在C++里面执行。
2.函数参数为代理
当代理作为函数的参数的时候而且需要和蓝图交互的时候,代理只能使用单播的动态代理
DECLARE_DYNAMIC_DELEGATE_OneParam(FMyDyanimDele, FString, str);
//委托变量作为参数
UFUNCTION(BlueprintCallable, Category = "Dele")
void RegFunDel(FMyDyanimDele MyDyanimDele);
然后在CPP里面执行函数参数里面的代理
void AFWActor::RegFunDel(FMyDyanimDele MyDyanimDele)
{
//执行代理
MyDyanimDele.ExecuteIfBound(FString("Just do"));
}
效果:
3.虚幻的函数指针TFunction
TFunction<void(FString)> FuntionOnePtr;
void(FString)是这个函数指针所有指向函数的类型
用法实例:
我们定义一个函数去给这个指针赋值
//定义
void BindFuntionPtr(TFunction<void(FString)> js);
//实现
void AFWActor::BindFuntionPtr(TFunction<void(FString)> js)
{
FuntionOnePtr = js;
FuntionOnePtr("函数指针赋值完成");
}
当在另一个类里面,我们需要定义一个类型为void(FString)的函数,然后调用BindFuntionPtr()。
需要绑定的函数
void AFWReceActor::FuntionReceOne(FString str)
{
GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Blue, str);
}
用Lamda函数绑定
AFWActor* ONE = Cast<AFWActor>(AArrau[0]);
//只能绑定一个Lamda函数Lamda函数里面去调用对应的函数。
ONE->BindFuntionPtr([this](FString cd) {
FuntionReceOne(cd);
});
4.第二种函数指针传递方式
利用泛型去构造出相对应的函数指针
template<class UserClass>
void RegFunTwo(UserClass* TargetClass, typename TMemFunPtrType<false, UserClass, void(int,FString)>::Type InMethod);
上面的是模板模板函数TMemFunPtrType<false, UserClass, void(int,FString)>::Type,会构建出一个函数指针Type,类型就为void(int,FString)然后利用typename关键字,重新命名为InMethod。
实现:
template<class UserClass>
void AFWActor::RegFunTwo(UserClass* TargetClass, typename TMemFunPtrType<false, UserClass, void(int,FString)>::Type InMethod)
{
//InMethod就是传递过来的函数,可以用()去访问这个函数;也可以用一个相同类型的代理,去绑定这个函数,然后可以随时调用DECLARE_DELEGATE_TwoParams(FMyDeleTwo,int ,FString)
FMyDeleTwo cd;
cd.BindUObject(TargetClass, InMethod);
cd.ExecuteIfBound(555555,"Fsting");
}
使用方法:
ONE->RegFunTwo(this, &AFWReceActor::FuntionRecetwo);
拓展
我们个可以用一个泛型去构建TFUntion指针, 这样就不用开始就定义TFUntion的类型了。
定义:
template<typename RetType,typename...VarTypes>
void RegFunFive(TFunction<RetType(VarTypes...)> fun);
实现:
template<typename RetType, typename... VarTypes>
void AFWActor::RegFunFive(TFunction<RetType(VarTypes...)> fun)
{
GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Blue, fun(1,"54"));
}
使用方法:
ONE->RegFunFive<FString, float, FString>([this](float cd,FString fg) {
return FuntionReceFive(cd, fg);
});
FuntionReceFive()是需要传递的函数。