碰撞检测中高速物体直接穿过包围盒问题

在游戏开发的过程中会出现物体直接穿过碰撞体的情况:

1.由于碰撞物体太薄了

2.由于物体的移动速度太快

分析原因:由于在Unity中的碰撞检测是有时间花费的,而每帧之间的时间间隔大概是0.02s如果速度太快或者是碰撞物体的太薄了,下一帧可能物体已经穿过了碰撞体,没有来的及进行碰撞检测。如图:

碰撞检测中高速物体直接穿过包围盒问题

在前一帧时还在碰撞体的左边在下一帧已经在碰撞体的右边,这个时候就会高速的穿过,碰撞检测每检测到。

解决方案:

通过射线检测如果在两帧之间射线发生碰撞那么此时记为发生碰撞。

代码如下:

Vector3 oriPos=transform.position;//获取当前帧的位置

Transform.Translate(Vector3.forword*speed*Time.deltaTime);

float length=(Transform.position-oriPos)*magnitude;//获取距离

Vector3 direction=transform.position-oriPos;

RaycastHit hit;

bool isCollider=Physics.Raycast(originPos,direction,out hit,length)//在两个位置之间发射一条射线,如果发生碰撞那么返回发生碰撞。

同时也可以在刚开始的状态下发射射线,射线的长度是speed*Time.deltaTime;