首页 > 解决方案 > 当我提高速度时,OnCollisionEnter 不起作用

问题描述

我统一创建了 6 个盒子对撞机,形状像一个立方体。立方体内部有一个球体。画面画面这是我的球体运动脚本。

private Vector3 moveDirection=new Vector3();
  

      public float speed = 7;
        private void Start()
        {
            moveDirection = transform.forward;
        }
        private void Update()
        {
            var transform1 = transform;
            transform1.position += moveDirection * Time.deltaTime * speed;
        }
    
        private void OnCollisionEnter(Collision collision)
        {
            moveDirection = Vector3.Reflect(moveDirection, collision.contacts[0].normal);
        }
         

如您所见,如果您运行此球体,它将在立方体内无限移动,但如果尝试将速度更改为 60 或更高速度,则球体会在立方体外移动。那么我该如何解决这个问题呢?

标签: unity3dcollision-detection

解决方案


你可以做一些事情来帮助碰撞,碰撞没有“工作”的原因是因为你的球体移动得太快以至于它从不接触对撞机,它完全跳过它。

您可以做一些事情来尝试修复它。

如果您有一个刚体连接到您的球体,您可以将 RigidBody Interpolate 设置为“Interpolate”
阅读此处了解它的作用

您还可以将碰撞检测设置为连续动态。

DontGoThroughThingsScripts附加到您的球体上 阅读此处的 DontGoThroughThingsScripts。它通过在你的最后一个点和你的当前点之间进行光线投射来工作,如果它击中一个对撞机,它会将你移回你应该碰撞的地方

Edit -> Project Settings -> Physics 中将 Default Solver Iterations 设置为更高的值。这通过运行更多次并消除错误来提高准确性。

最后,您还可以增加对撞机的大小,使球体更难错过(不是永久或干净的修复方法)

请注意,这将对性能产生很大影响。这是一个不可避免的权衡。


推荐阅读