Unity移动过快导致射线检测失效的原因及处理方式

时间:2024-04-05 11:32:05

直入正题,检测失效的原因如图,设此时子弹,射线,碰撞体属性都如图所示,这里射线从子弹的坐标位置发出,发出位置可以通过修改预设或者增加偏移量的方式进行修改。

Unity移动过快导致射线检测失效的原因及处理方式

可以看到,第一帧进行射线检测时,子弹距离碰撞体太远(或者说射线长度不够)导致并没有检测到碰撞,结果第二帧时,子弹已经飞过了碰撞体,此时再次进行射线检测,当然也不会检测到,如此就导致了射线检测失效。

怎么去解决这个问题,很简单,增加射线的长度即可,但是增加多少呢?假如这里把射线长度增加到2000,那么第一帧必然能检测到碰撞体,但是如果像下面这种情况,就会出大问题。

Unity移动过快导致射线检测失效的原因及处理方式

可以看到,现在碰撞体距离子弹有1500码,正常情况(没有射线检测,论实际碰撞)下,子弹要3帧后才会碰到碰撞体,这里与实际情况差了3帧,当然是不能接受的,所以,怎么去设定这个射线的长度是问题关键。继续看图

Unity移动过快导致射线检测失效的原因及处理方式

第二帧那里把第一帧子弹的状态也标了出来,可以看到第一帧到第二帧之间漏掉的检测距离 = 移动距离 - 射线长度。我们要做的就是去掉这个漏掉的检测距离,从而让射线检测一直连续起来。显而易见,当射线长度 = 移动距离时,漏掉的部分就  = 0。结果即 射线的长度应该为子弹一帧内的路程。

显然这里的碰撞也是不精确的,因为这里提前1帧触发了碰撞,与实际的碰撞还是有差距。但是相比之前,已经好了很多,而且,各种子弹的移动速度都各不相同,定长的射线长度需要给每一种速度配置一个对应值,实属出力不讨好。这里直接计算会方便很多。如果想进一步精确的话,建议考虑四舍五入,即在射线检测到碰撞时,计算子弹与碰撞点的距离(d),然后与子弹一帧内路程(v)进行比较,若d/v<0.5,则表示碰撞会在未来0.5帧内响应,在当前帧触发碰撞事件比较接近实际效果,反之则在下一帧去触发碰撞事件更加合理。

为了防止极端情况,即射线刚刚好(这个词.就细品吧..也说不明白)碰不到碰撞体,建议射线长度添加一个偏移量,+1即可。当然我并不清楚是不是会出现这种情况,只是预防一下。

到此完结,有人能看出来这图是用ugui拼的吗,hhh。