UE4代理和函数传递

5 篇文章 0 订阅

代理和函数传递

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()是需要传递的函数。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值