在上一篇,我们实现了火球术可以向目标方向发射,并且还可以按住Shift选择方向进行攻击。技能的问题解决,现在人物释放技能时,无法朝向目标方向,接下来我们解决人物的问题。
实现思路:
我们将使用一个官方的新插件叫Motion Warping来实现它,然后在蒙太奇中设置它的旋转即可。
添加Motion Warping
这个插件默认是不会开启的,需要我们单独去开起,打开插件,搜索Motion Warping
开启并重启,因为它是测试插件,会提示你
打开角色的蓝图,添加插件
修改蒙太奇
插件添加了,使用它需要我们修改蒙太奇,在蒙太奇中确定在什么时候要朝向目标,当角色播放动画时,也会进行对应的旋转操作。
我们先在蒙太奇添加一行通知,和事件的分开,方便查看
在这一行中,添加通知状态中选择Motion Warping
它有一个开始和结束,方便我们设置移动的时间范围
选中通知,在细节那里修改它的名称,我们需要一个名称
我们只需要修改角色旋转,不需要修改移动,所以将移动关闭,并且将旋转类型修改为朝向目标点
这里记得打开动画文件(蒙太奇的源动画),设置开启根运动,开启这一项以后,动作中的修改角色旋转移动的值会应用到角色身上
在动画中设置完成了,只是实现了逻辑,比如角色需要朝向那里我们还没有设置,接下来我们将实现角色朝向的目标的设置。
设置角色应该朝向的目标位置
打开角色蓝图,我们需要添加一个自定义事件来实现对目标位置的添加。
然后通过自定义事件调用Motion Warping组件的上的函数节点来实现,
它需要两个值,一个值是名称,就是我们前面设置蒙太奇动画里面添加的通知的名称,这个名称最好cv,避免出错。
另一个值就是需要设置的朝向位置,这个我们在技能中调用设置,所以作为参数传入设置。
接着打开技能,在技能蓝图类里面,获取到目标位置后,将Avatar转换为角色类,接着再调用事件,实现对目标位置设置
接着就可以运行测试了。
虽然这样实现了功能,但是获取角色时需要转换的耦合度太高,如果切换了使用的角色,我们是不是每次都要修改,肯定不是我们想要的方式,我们没必要将其必须转换为对应的,我们可以将其转换为对应的接口就行,接口就是为这种情况而生的。
接下来,我们将实现通过接口设置Motion Warping的函数。
打开代码,找到我们之前创建的战斗接口,和战斗有关的角色类都会继承此接口,它不但会实现通用,而且还能节省转换性能消耗。
在战斗接口内增加一个需要蓝图可以覆盖的函数(BlueprintImplementableEvent),并且在蓝图中也可以去调用(BlueprintCallable)。
UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)
void UpdateFacingTarget(const FVector& Target);
我们还需要将战斗接口设置为蓝图类型,这样在蓝图中可以将其转换为对应的接口
UINTERFACE(MinimalAPI, BlueprintType)
class UCombatInterface : public UInterface
{...
编译打开蓝图,将我们实现的角色内的自定义事件,修改为通过UpdateFacingTarget
去调用
接着,修改技能里的转换接口,转换成战斗接口,调用函数
这样,只要继承了战斗接口,不管是什么角色,都可以实现此接口的调用。