UE4C++Delegate的使用
一.单播代理
主要分为无参数的单播代理,有参数的单播代理和带返回值的单播代理。
1.声明:
2.定义:
3.使用:
首先定义需要绑定的方法:
以带一个参数的代理OneParam和无参数的代理NoParam为例,首先在类里创建两个函数用于绑定,参数要与代理对应。
然后与代理进行绑定,ue4提供了多种不同的方式:
(1)BindUObject:
参数一:需要绑定的对象,这里直接用的this,也可以根据情况绑定在玩家上等等。
参数二:绑定的方法,传递一个函数指针。
(2)BindLambda:
lambda表达式的说明:
之前绑定了OneParam和无参数的代理NoParam,这里绑定带返回值的代理ReTwoParam。
[]:表示捕获的值,因为是匿名函数无法使用外部的参数,所以需要用[]捕获才可以使用,案例中以直传递的方式捕获了a,也可以传递引用,指针,this指针等,this指针表示可以使用类中所有的值:
空。没有任何函数对象参数。
=。函数体内可以使用 Lambda 所在范围内所有可见的局部变量(包括 Lambda 所在类的 this),并且是值传递方式(相
当于编译器自动为我们按值传递了所有局部变量)。
&。函数体内可以使用 Lambda 所在范围内所有可见的局部变量(包括 Lambda 所在类的 this),并且是引用传递方式
(相当于是编译器自动为我们按引用传递了所有局部变量)。
this。函数体内可以使用 Lambda 所在类中的成员变量。
a。将 a 按值进行传递。按值进行传递时,函数体内不能修改传递进来的 a 的拷贝,因为默认情况下函数是 const 的,要
修改传递进来的拷贝,可以添加 mutable 修饰符。
&a。将 a 按引用进行传递。
a,&b。将 a 按值传递,b 按引用进行传递。
=,&a,&b。除 a 和 b 按引用进行传递外,其他参数都按值进行传递。
&,a,b。除 a 和 b 按值进行传递外,其他参数都按引用进行传递。
():表示形参
mutable:如果使用值传递捕获,mutable允许修改,例如例子中a=44.如果没有mutable则无法修改a的值。
->***:表示返回值 ,这里是int32.
(3)BindRaw:
如果有需要还可以绑定原声c++类
参数一:需要绑定的对象。
参数二:绑定的方法,传递一个函数指针。
(4)BindSP & BindThreadSafeSP:
绑定共享指针,参数同上。
(5)BindSP & BindThreadSafeSP:
绑定静态函数,根据需要使用。
(6)BindUFunction:
参数一:需要绑定的对象。
参数二:绑定的函数名称。
这样我们就可以在需要的时候调用这些方法了,如子弹打到人掉血,ui血条显示等,执行的方式主要分为两种:
ExecuteIfBound:只适用于无参数的代理 ,例子中也就是NoParam
Execute:其他一般会用这个方法执行代理,执行之前检测是否有绑定。
执行结果:
二.多播代理
多播代理与单播的区别就是可以绑定多个事件,需要注意:没返回值 且绑定多个执行顺序不确定
1.声明:
2.定义:
3.使用:
多播定义绑定:
其实与单播相同,只是关键字变成了add,剩余参考单播代理绑定即可。
执行:
多播使用broadcast执行。
三.动态代理
动态代理可以给蓝图使用,可以绑定蓝图的事件,调用。注意:动态代理需要以F开头,并且给与参数名字,如果是动态多播绑定的函数必须使用反射UFUNCTION,否则会报错。
1.声明:
2.定义:
这里使用了BlueprintAssignable,这样蓝图里的事件也可以绑定。
3.使用:
(1)蓝图绑定:
其中val就是声明动态多播时候定义的值。
(2)C++绑定:
单播使用BindUFunction绑定。
多播使用AddDynamic绑定,这样调用的话会同时调用蓝图和c++里的代理。
(3)调用:
方法同上。
执行结果:本例中动态多播绑定了两个事件都是仅仅打印字符: