C# 为什么OnCollisionCenter会被呼叫两次?

C# 为什么OnCollisionCenter会被呼叫两次?,c#,unity3d,C#,Unity3d,我的场景中有一个立方体(播放器)和一个平面(地板)。两者都有碰撞器连接到它们,并且只有刚体组件连接到立方体。立方体位于平面上方 多维数据集附加了一个脚本,用于查找冲突 private void OnCollisionEnter(Collision collision) { Debug.Log("...........................Collision"); } 问题: 当平面和立方体碰撞时,消息将打印两次 碰撞 调试:日志(对

我的场景中有一个立方体(播放器)和一个平面(地板)。两者都有
碰撞器
连接到它们,并且只有
刚体
组件连接到立方体。立方体位于平面上方

多维数据集附加了一个脚本,用于查找冲突

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

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

碰撞

调试:日志(对象) 跳转:OnCollisionCenter(碰撞)(at Assets/jump.cs:34)

碰撞

调试:日志(对象) 跳转:OnCollisionCenter(碰撞)(at Assets/jump.cs:34)


为什么会这样?冲突是否发生了两次?

首先,两个日志似乎都来自第34行的
jump.cs
脚本,因此我们可以放心地说问题只是来自一个脚本,而不是来自多个脚本

为什么会这样

以下是可能的原因:

1。使用
OnCollisionCenter
功能的脚本将连接到多个游戏对象。这些多个游戏对象是相互碰撞的两个游戏对象。当它们碰撞时,
OnCollisionCenter
被多次调用

2。使用
OnCollisionCenter
功能的脚本会多次附加到同一游戏对象

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

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

void OnCollisionExit(Collision collisionInfo) 
{
        print("Collision Out: " + gameObject.name);
}
然后使用
OnCollisionCenter
功能检查日志的打印顺序

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


碰撞会发生两次吗

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

替换:

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


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

我认为可能是关于网格碰撞器的。我也有同样的问题,当我将网格碰撞器更改为长方体碰撞器时,问题消失了。我猜这是因为网格碰撞器中有多条碰撞线。试试看。

立方体上也只有一个盒子碰撞器。。对飞机来说,你不需要做很多评论。你可以把它放在一条评论里。3号怎么样。如果你说的一切都是真的,那么把这个简单的项目压缩,上传到某个地方,并把链接放在这里。我来看看。飞机上有两个对撞机<代码>网格碰撞器(我之前没有看到)和一个
框碰撞器
。没问题,欢迎使用。我只是想确定你们并没有接受那个些不能解决你们问题的答案。快乐编码!嘿,很抱歉打扰你,但我需要知道这件事。立方体碰到表面后会反弹吗?我也遇到过这种情况。
Debug.Log("Collision: " + gameObject.name);