为什么OnCollisionEnter会被调用两次?

时间:2017-05-20 10:00:29

标签: c# unity3d

我的场景中有一个 Cube (播放器)和一个 Plane (floor)。两者都附加了Colliders,并且RigidBody组件仅附加到<​​em>多维数据集。 多维数据集位于 Plane 上方。

Cube 附加了一个脚本,用于查找“碰撞”。

private void OnCollisionEnter(Collision collision)
    {
        Debug.Log("...........................Collision");
    }

问题:

当Plane和Cube发生碰撞时,消息会被打印两次。

  

..............................碰撞

     

UnityEngine.Debug:日志(对象)   jump:OnCollisionEnter(Collision)(在Assets / jump.cs:34)

     

..............................碰撞

     

UnityEngine.Debug:日志(对象)   jump:OnCollisionEnter(Collision)(在Assets / jump.cs:34)

为什么会这样?碰撞发生了两次吗?

2 个答案:

答案 0 :(得分:2)

首先,这两个日志似乎来自 jump.cs 脚本 34 ,所以我们可以放心地说问题只来自一个脚本不是来自许多脚本。

  

为什么会这样?

以下是可能的原因:

1 。您的OnCollisionEnter函数脚本附加到多个GameObjects。那些多个GameObject是两个相互碰撞的GameObject。当它们发生碰撞时,会多次调用OnCollisionEnter

enter image description here

2 。具有OnCollisionEnter功能的您的脚本多次附加到同一个GameObject。

enter image description here

3 。两个碰撞的游戏对象都在碰撞,退出然后再次碰撞。这是可能的,但在这种情况下不太可能,但值得一提。

您也可以通过添加OnCollisionExit来验证这一点:

void OnCollisionExit(Collision collisionInfo) 
{
        print("Collision Out: " + gameObject.name);
}

然后使用OnCollisionEnter功能检查日志的打印顺序。

4 。每个GameObject上有多个目前正在发生碰撞的碰撞器。如果你需要使用多个碰撞器作为复合碰撞器,将它们添加到一个空的GameObject,然后将它们放在另一个标签中,这样你就可以从脚本中忽略它们。

enter image description here

  

碰撞发生了两次吗?

只有您可以回答这个问题,因为现场就在您面前。

替换:

Debug.Log("...........................Collision");

Debug.Log("Collision: " + gameObject.name);

如果两个日志中GameObjects的名称相同,则为是,可能会发生两次。

答案 1 :(得分:0)

我认为这可能与网状对撞机有关。我遇到了同样的问题,当我将网格对撞机更改为盒对撞机时,问题就消失了。我对此的猜测是网格碰撞器中的多条碰撞线。试试看。