这次分享一个我在DynamicCombatSystem里面学来的一个功能——就是判断攻击的位置,例如在黑暗之魂中玩家经常要用到背刺,那么就得站到敌人的背后进行攻击,如何判断玩家是在敌人的背后呢?
Step1
创建一个枚举,有四个位置,前、后、左、右
Step2
在玩家(攻击者蓝图)创建一个函数GetHitDirection,添加参数From(攻击者)和To(被攻击者),返回值就是刚刚创建的枚举(HitDirection)。
Step3
在函数中创建3个局部变量HitDirection(E_HitDirection)、LocalFrom和LocalTo.LocalFrom 和 LocalTo主要是用来保存传进来的From 和 To,这样就可以直接用这两个局部变量来写蓝图,显得不那么乱。
Step4
利用向量的点乘结果可以得到两者之间的夹角余弦值,通过这个就可以判断,比如看下面这个蓝图,获取敌人的right vector和从敌人到玩家的向量unit direction,用这两个向量点乘,如果结果小于0说明夹角大于90度,玩家在敌人的左半边,结果大于0说明夹角小于90度,玩家在敌人的右半边。
但是这个还不能够满足需求,我们希望是下面这图中显示的四个方向的,所以我们的逻辑应该是先计算在前还是在后,且区域是前后一个扇形区域,同样可以利用计算点乘的方式来判断夹角大小,如果不在前后曲区域,在去判断在做还是在右,(当然一般我们只需要计算出在后面就OK了)
这是DynamicCombatSystem中的完整蓝图,返回的值是枚举
那么我们就试试效果:
在背后攻击
在左边攻击
在右边攻击
在正面攻击
**
后记:
**
当然要真正实现《黑暗之魂》中的被刺效果我们还要让玩家检测到敌人在玩家的前方,
不然会出现下面这个情况:命名没有正面攻击屁股,但是仍然会判断在背后攻击,
一个完整的背刺系统应该还得包括更多的东西,比如给敌人加上一个接口判断能不能被刺,玩家持不同武器、不同敌人的背刺动画、背刺音效和背刺时的相机移动才能创造出像《黑暗之魂3》那样实现背刺的爽快感!