去年1月份的时候稍微研究了下:
http://www.cnblogs.com/hont/p/4264518.html
当时觉得是参数没设置对,然后这个问题就无解不了了之了。今天又拿出来看了一下,找到了解决办法
测试环境很简单,一面墙,红色方块不停向前
然后,由于刚体是FixedUpdate执行的,把FixedUpdate执行间隔调慢一些方便Debug:
OK,下面还原一次经典的穿透问题:
测试脚本:
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; }
然后我尝试把碰撞检测改为连续:
终于,没有出现穿透:
再补上一个夹角测试:(卡是因为我把FixedUpdate频率调低了)
测试脚本:
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; } }
时间: 2024-10-16 15:23:55