碰撞检测中高速物体直接穿过包围盒问题
在游戏开发的过程中会出现物体直接穿过碰撞体的情况:
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;