【问题标题】:Unity collision bounces off, but no OnCollisionEnterUnity 碰撞反弹,但没有 OnCollisionEnter
【发布时间】:2013-11-16 08:22:34
【问题描述】:

Unity 碰撞系统有问题。

我正在尝试将一些 3d 对象(岩石)添加到我的场景中使用网格碰撞器(勾选凸网格碰撞器),但是没有刚体。我有一个子弹预制带有刚体和球体对撞机。我在子弹预制件上附加了一个脚本,OnCollisionEnter 它应该破坏子弹预制件并播放爆炸粒子。

现在的问题是,当我将子弹射向 3d 对象(岩石)时,它弹开而不是爆炸(又名没有调用 OnCollisionEnter)。与其他对撞机(如盒子、胶囊或地形对撞机)一起使用就可以了。

我尝试向它添加一个刚体,然后它开始工作,OnCollisionEnter 被调用并且子弹爆炸了,但问题在于我可以用物理方法移动 3d 对象,而我不应该这样做。为了解决这个问题,我尝试在检查器中限制位置和旋转,我认为这解决了我的问题,因为子弹在接触时爆炸并且3d对象获胜'不要移动,但现在我的另一个问题是我可以穿过物体...

知道如何解决我的问题吗?这样我就会有一个带有 meshcollider 的 3d 对象,在与球体对撞机接触时调用 OnCollisionEnter,但不让我通过它?

Edit1:忘了说我已经尝试过 IsKinematic 同样的规则适用,子弹弹开,但没有调用 OnCollisionEnter。

Edit2,有点解决方案:我最终复制对象,从第二个对象中移除网格渲染器,稍微缩放它并移除 Gravity 和 IsKinematic,这样层触发 OnCollisionEnter 并且我的子弹爆炸了,原来是让 IsKinematic 女巫不要让我穿过物体,因为另一层有点大,子弹不能反弹。尽管这似乎可行,但对我来说,这似乎有点过头了,可能会给我带来开销,有没有更好的解决方案?

【问题讨论】:

    标签: unity3d game-physics unityscript


    【解决方案1】:

    我发现了导致问题的原因。我将球体对撞机半径设置得太小(0.025 而不是 0.5,不知道 xD 我的错)并且由于动态连续物理的某些奇怪原因,它正在检测碰撞但没有引发任何事件。仅当与地形或基本形状碰撞时,而不是与网格碰撞器。

    这是一个有趣的行为,但至少现在我知道我做错了什么。

    【讨论】:

      【解决方案2】:

      如果你想禁用对象的物理特性(我不确定你是否已经这样做了)尝试单击对象,转到刚体组件,然后禁用重力复选框(假设你没有'不希望应用重力)并启用“是运动学”复选框。运动学告诉 unity 不要将物理应用到您的对象。

      编辑:还要确保撤消您当前拥有的固定定位,如果 Kinematic 为您工作,那就是。

      【讨论】:

      • 已经尝试过了,它具有相同的行为。子弹弹开,但没有调用 OnCollisionEnter。
      • 您可以发布您正在使用的脚本吗?一种解决方案是使用 OnTriggerEnter 但如果我能看到您的代码,我可以为您提供最好的帮助。同样对于你的edit2,它真的很聪明,但我会远离渲染两个对象,如果你有100个对象,它会显着增加你的开销——大约200个(更不用说额外的drawcall等)跨度>
      • 没有额外的绘制调用,因为正如我所说,我从第二个中删除了网格渲染器。我什至尝试使用 OnTriggerEnter,但似乎也没有工作。但这与代码无关,我试图只调用 Debug.Log("test"); OnCollisionEnter 仍然没有。现在的实际代码void OnCollisionEnter(Collision col) { Instantiate(explosionPrefab, transform.position, transform.rotation); AudioSource.PlayClipAtPoint(explosionSound,transform.position); Destroy(gameObject); }
      • 嗯,奇怪,很难说这到底是怎么回事。其中之一是,如果您不调用该特定对象( OnCollisionEnter( ) 工作得很好),则不需要传入 Collision col 。你试过光线投射吗?它通常对射弹更有效,因为有时射弹可以移动得如此之快以至于无法被对撞机检测到。如果你愿意,我可以提供一个例子。
      • 但这就是它从物体上反弹的问题,而不是穿过它......如果它穿过它,那么很明显没有检测到碰撞,但它反弹物理上是正确的,这就是为什么我很困惑为什么不调用 OnCollisionEnter ......光线投射将是一个临时解决方案,在这种情况下可以工作,但我需要让它工作,因为我从导入的每种类型的 3d 对象中得到相同的行为只要他们有网格对撞机而不是图元。
      【解决方案3】:

      我忽略了一些可能对某人有帮助的东西。当我的游戏使用 2D 物理时,我试图检测 3D 碰撞。因此,例如,如果您使用 BoxCollider2D,请确保您使用 OnCollisionEnter2D(Collision2D 碰撞)

      【讨论】:

        猜你喜欢
        • 2022-11-04
        • 1970-01-01
        • 1970-01-01
        • 2022-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-16
        • 1970-01-01
        相关资源
        最近更新 更多