public 函数_UE4精品教程 | 渲染编程(C++篇)【第三卷:从仿函数到std::function再到虚幻4Delegate】...

44f4042a09f2f9b581e3c7da3053e872.gif

本文转载于YivanLee知乎作者

专题目录链接:https://zhuanlan.zhihu.com/p/67694999

这几天研究了一下虚幻4的delegate,但是想要理解这个,还得从仿函数说起。下面是一段代码例子:

class MyFunctor
{
public:
int operator()(int x) { return x * 2;}
}

MyFunctor doubler;
int x = doubler(5);

The real advantage is that a functor can hold state.

class Matcher
{
int target;
public:
Matcher(int m) : target(m) {}
bool operator()(int x) { return x == target;}
}

Matcher Is5(5);

if (Is5(n)) // same as if (n == 5)
{ ....}

现在还可以使用std::function

#include 
#include
#include
using namespace std;
class MyCharacter
{
public:
void BeHurt01(int hurtvalue)
{
cout << "hurt01" << hurtvalue << endl;
}
void BeHurt02(int hurtvalue)
{
cout << "hurt02" << hurtvalue << endl;
}
};
class OtherCharacter
{
public:
functionThisIsDelegate;
};
int main()
{
MyCharacter mycha;
OtherCharacter othecha;
othecha.ThisIsDelegate = bind(&MyCharacter::BeHurt01, &mycha, placeholders::_1);
othecha.ThisIsDelegate(19);
return 0;
}

这样做的好处就是实现延迟调用,比如我现在有个主角和一个怪物。因为需要完成动画播放,主角的出招的特效播放之后才会执行怪物受伤扣血的逻辑。这时候可以先在主角出招的时候探测周围的怪物然后给他们绑定上伤害函数。

相对于函数指针,std::function能绑定c++里的所有可调用对象,stdfunction相当于帮我们封装了一个模板。

比如:

(1)首先我们建立一个第三人称c++模板工程

bc3d7f65b150cc8d32a157ba73cbcb16.png

然后打开代码,在MyProjectCharacter.h中声明一个代理,两个与之匹配的函数

96632a5a67d3bdb4d5da1874ab0324cb.png

在构造函数中将函数和代理绑定

e861a06e423f9fbf1e60aab8a6d86154.png
32a60f3a396b29fa1400b7e73522476e.png

在MoveForward函数里执行这个代理

d7b82815a18fe516662c23b7f4c51ffa.png

完成绑定工作后我们到gamemode类里做如下工作

b255548121092a39ca4e622d3075c955.png
d84c0d39312fd3720f852d88ebc18e72.png

至此我们就可以在游戏执行后,按下w键之后的log里看到如下的输出

a32fa7e5fee0b068c7395784ef4b8013.png

fbcc9576d40292e5d4b528f8e8cfd8d7.gif c21cee2dac71cb646c95df15172a48e6.gif e718adb485a1f7d20039b47cf9288c5a.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值