VR下实现匕首的功能,需求如下:
1,玩家可以拿着一把匕首攻击怪物,攻击的伤害,依据玩家攻击时的速度,和攻击到怪物的部位决定
2,攻击到怪物的位置会播放一个溅血的特效
3,在比较短暂的时间内,玩家攻击的动作必须要具有一定的幅度才会有伤害,也就是说,在攻击到怪物时,玩家持刀的手臂必须做一定距离的运动.
作此限制,是为了避免接触怪物即造成伤害,以至于玩家只需要不断的微小移动手臂就可以反复攻击
这里的几个难点如下:
一,如何判断匕首攻击到怪物的具体位置和部位呢?
首先想到的是通过设置Collison Response为Block来解决的, 如果这样做,那么刀与玩家自身以及世界中的物体产生碰撞时,刀就会影响被碰撞物体的运动,这是不想看到的.
那么可否设置Collison Response不为Overlap呢,这样设置,刀不会影响物体的运动,可以插入到物体中,可是Overlap时得到的HitResult却不含有Location以及BoneName.
最后想到可以使用BoxTraceByChannel来解决,如下图所示
每隔一段时间执行一次BoxTraceByChannel就可以获得碰撞信息
注:途中的Box是一个BoxCollison,使用它的形状包围刀,方便设置和调整,如下图所示
二,如何判断玩家在攻击到怪物之前的一段时间内是否有一定幅度的运动呢?
再具体一下上述问题中的时间和幅度,假设时间是0.5s,距离是0.5m.
那么问题就转化为:如何确定玩家在攻击到怪物的0.5s时间内,玩家距离攻击位置的最大距离超过0.5m
也就是说,我们需要知道在攻击到怪物之前的0.5s内,玩家的移动位置,然后找出距离攻击位置最大的,如果超过0.5m,此次攻击是有效的.
因为我们不知道玩家何时会攻击到怪物,所以我们必须保存玩家当前时刻之前的0.5s内的所有位置,我们可以保存20个,那么0.5/20 = 0.025s/个,
也就是每隔0.025s采集一下玩家手臂的位置循环保存到一个长度20的数组里即可.