再看刚体穿透问题

去年1月份的时候稍微研究了下:

http://www.cnblogs.com/hont/p/4264518.html

 

当时觉得是参数没设置对,然后这个问题就无解不了了之了。今天又拿出来看了一下,找到了解决办法

 

 

测试环境很简单,一面墙,红色方块不停向前

再看刚体穿透问题_第1张图片

 

然后,由于刚体是FixedUpdate执行的,把FixedUpdate执行间隔调慢一些方便Debug:

再看刚体穿透问题_第2张图片

 

 

OK,下面还原一次经典的穿透问题:

再看刚体穿透问题_第3张图片

 

测试脚本:

void Update()
{
    transform.Translate(0, 0, 10 * Time.deltaTime);
}

 

 

OK,然后我测试了几种方法,最后发现直接改速率最为有效:(注释掉的方法都测试失败)

void FixedUpdate()
{
    //GetComponent<Rigidbody>().MovePosition(transform.position + transform.forward * 10 * Time.deltaTime);
    //transform.Translate(0, 0, 10 * Time.deltaTime);
    //transform.Translate(0, 0, 10 * Time.fixedDeltaTime);
    //GetComponent<Rigidbody>().MovePosition(transform.position + transform.forward * 10 * Time.fixedDeltaTime);
    //GetComponent<Rigidbody>().AddForceAtPosition(new Vector3(0, 0, 3), transform.position + transform.forward, ForceMode.VelocityChange);
    GetComponent<Rigidbody>().velocity = transform.forward * 10f;
}

 

 

但这只是防止FixedUpdate更新频率低的解决方法,我极限测试了一下,又穿透了:

void FixedUpdate()
{
    GetComponent<Rigidbody>().velocity = transform.forward * 100000f;
}

 

 

然后我尝试把碰撞检测改为连续:

再看刚体穿透问题_第4张图片

 

 

终于,没有出现穿透:

再看刚体穿透问题_第5张图片

 

 

再补上一个夹角测试:(卡是因为我把FixedUpdate频率调低了)

再看刚体穿透问题_第6张图片

 

测试脚本:

void Update()
{
    if(Input.GetKey( KeyCode.A))
    {
        GetComponent<Rigidbody>().velocity = transform.right * -20f;
    }

    if (Input.GetKey(KeyCode.D))
    {
        GetComponent<Rigidbody>().velocity = transform.right * 20f;
    }

    if (Input.GetKey(KeyCode.W))
    {
        GetComponent<Rigidbody>().velocity = transform.forward * 20f;
    }

    if (Input.GetKey(KeyCode.S))
    {
        GetComponent<Rigidbody>().velocity = transform.forward * -20f;
    }
}
View Code

 

 

另外测了一下Animator的穿透情况,打开根运动造成的位移不会穿透。如果是动画控制的位移会穿透

和UpdateMode的具体模式无关

你可能感兴趣的:(再看刚体穿透问题)