Unreal Engine 5 事件,函数与宏浅析
引言
本文简单介绍一下UE5中事件函数和宏的区别
事件
在UE4/5中,函数和事件的概念已经被彻底分开,所有事件被统一到“事件图表”选项卡中编写其实现,而函数的实现是每个函数单独一个选项卡。这样安排是因为UE希望一个Actor的主要流程在“事件图表”中完成。蓝图的阅读者,只需要查看“事件图表”就可以明白这个Actor的主要逻辑。
而要做到这一点,就要求事件具有这样的特点:
事件的调用必须不影响流程(也就是执行路径,白色的线)的执行,执行路径不必等待事件反馈任何结果就必须立即继续执行,因此UE4/5中要求,事件不可以带有返回值。由于不带有返回值,事件的实现中是可以使用Delay和Timer这样的节点的。
函数
但是,我们有时候需要对方提供返回值,例如,我在攻击一个带有反甲的角色的时候,需要对方提供返回的伤害,这个时候应该使用函数.
函数可以带有一个执行输入节点和执行输出节点,也可以不带(纯函数);(是否要设计为纯函数,取决于你是否会在这个函数内改变蓝图的全局变量,如果你不需要改变,习惯定义为纯函数),可以带有多个输入值和一个返回值,但是函数的执行必须是线性并且在一帧内完成,这意味着你不可以在函数中使用潜在动作(Delay,播放动画蒙太奇等)
宏
宏可以简单理解为了方便重用将事件实现中节点放到一起,由于宏是事件的实现,因此宏可以决定执行的路径,即宏可以有多个执行输入和多个执行输出.宏不可以在另一个蓝图中调用
如何使用
当我们在写蓝图类或者定义蓝图接口时,通常会在这三者的选择之间产生疑惑,这里我们简单总结了以下经验:
一个类的主要业务逻辑应该写在事件的实现里,事件的功能最为强大,因为事件可以使用绝大部分蓝图节点
需要返回的复用逻辑写到函数里,大部分情况下,需要返回值的场景是各种数值:
计算范围判定(输入角度与距离,返回可击中的敌人类)
属性克制判定(输入敌人类和攻击类别,返回伤害系数)
伤害数值判定(输入技能伤害,计算基础攻击力与各类BUFF)
各类数值调用(封装底层属性,使用纯函数Get&Set特定属性变量)宏主要是用来做可复用的异步逻辑或流程控制