Unity 碰撞检测 中高速物体 直接穿透问题射线检测的几种用法

----1)
给运动物体的Rigidbody 的 Collision Detection属性选择Continuous Dynamic
再给这个运动物体将要碰到的物体添加Rigidbody 的 Collision Detection属性选择Continuous

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

1.由于碰撞物体太薄了

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

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

Unity 碰撞检测 中高速物体 直接穿透问题射线检测的几种用法_第1张图片

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

解决方案:

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

代码如下:

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

Transform.Translate(Vector3.forwordspeedTime.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;

问题:假设现在A物体以非常高的速度移动,而unity每一帧的检测时间大概是0.02秒,也就是说如果物体A速度过快,在不用0.02秒的时间就已经穿过了其他物体,那么这个时候是无法检测A与其他物体之间的碰撞信息的,解决方法如下

void Update ()
{
Vector3 oriPos = transform.position;//记录原来的位置
transform.Translate (Vector3.forward * speed * Time.deltaTime); //移动
float length = (transform.position - oriPos).magnitude;//射线的长度
Vector3 direction = transform.position - oriPos;//方向
RaycastHit hitinfo;
bool isCollider = Physics.Raycast (oriPos, direction,out hitinfo,length);//在两个位置之间发起一条射线,然后通过这条射线去检测有没有发生碰撞
if(isCollider)
{

}
}


射线检测的几种用法


//从角色位置向NPC发射一条经过鼠标位置的射线
Ray mRay=Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit mHi;
if(Physics.Raycast(mRay,out mHi)) //判断是否击中了什么
{
if(Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButtonDown(0))
{
if(Vector3 .Distance (this .transform.position ,mHi .transform.position )<10)
{
if(mHi.collider.gameObject.tag==“NPC”)//用的是tag进行辨别
{
mHi.collider.gameObject.GetComponent ().OnMouse ();
}
}
}
}

你可能感兴趣的:(Unity,Unity   SDK,JDK)