【问题标题】:Why is OnCollisionEnter getting called twice?为什么 OnCollisionEnter 被调用两次?
【发布时间】:2017-05-20 10:00:28
【问题描述】:

我的场景中有一个立方体(玩家)和一个平面(地板)。两者都附加了Colliders,并且只有一个RigidBody 组件附加到CubeCube 位于 Plane 上方。

Cube 附有一个用于查找碰撞的脚本。

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

问题:

当平面和立方体碰撞时,消息会被打印两次。

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

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

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

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

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

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

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

    为什么会这样?

    以下是可能的原因:

    1.您的带有OnCollisionEnter 函数的脚本附加到多个游戏对象。这些多个游戏对象是相互碰撞的两个游戏对象。当它们发生碰撞时,OnCollisionEnter 会被多次调用。

    2.您的带有OnCollisionEnter 函数的脚本多次附加到同一个游戏对象。

    3.Both Colliding GameObjects 正在碰撞,退出然后再次碰撞。这是可能的,但在这种情况下不太可能,但值得一提。

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

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

    然后使用OnCollisionEnter函数检查日志的打印顺序。

    4。当前正在碰撞的每个 GameObject 上有多个碰撞器。如果您需要将多个碰撞器用作复合碰撞器,请将它们添加到子空 GameObject 中,然后将它们放在不同的标签中,以便您可以从脚本中忽略它们。


    碰撞是否发生了两次?

    只有你才能回答这个问题,因为场景就在你面前。

    替换:

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

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

    如果两个日志中的游戏对象的名称相同,那么是的,它可能会发生两次。

    【讨论】:

    • 此外,立方体上只有一个 Box Collider.. 和平面上只有一个
    • 你不需要做很多cmets。您可以将其放在一条评论中。 #3 怎么样。如果你说的一切都是真的,那么压缩那个简单的项目,把它上传到某个地方并把链接放在这里。我去看看。
    • 飞机上有 2 个对撞机。 Mesh collider(我之前没见过)和Box Collider
    • 没问题,不客气。我只是想确保您不接受不能解决您问题的答案。编码愉快!
    • 嘿,很抱歉打扰您,但我需要知道这一点。立方体撞击表面后会反弹吗?
    【解决方案2】:

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

    【讨论】:

    • 这也发生在我身上。
    猜你喜欢
    • 2021-07-13
    • 2021-11-25
    • 2015-12-24
    • 2012-12-10
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多