我的场景中有一个 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)
为什么会这样?碰撞发生了两次吗?
答案 0 :(得分:2)
首先,这两个日志似乎来自 jump.cs
脚本 34 ,所以我们可以放心地说问题只来自一个脚本不是来自许多脚本。
为什么会这样?
以下是可能的原因:
1 。您的OnCollisionEnter
函数脚本附加到多个GameObjects。那些多个GameObject是两个相互碰撞的GameObject。当它们发生碰撞时,会多次调用OnCollisionEnter
。
2 。具有OnCollisionEnter
功能的您的脚本多次附加到同一个GameObject。
3 。两个碰撞的游戏对象都在碰撞,退出然后再次碰撞。这是可能的,但在这种情况下不太可能,但值得一提。
您也可以通过添加OnCollisionExit
来验证这一点:
void OnCollisionExit(Collision collisionInfo)
{
print("Collision Out: " + gameObject.name);
}
然后使用OnCollisionEnter
功能检查日志的打印顺序。
4 。每个GameObject上有多个目前正在发生碰撞的碰撞器。如果你需要使用多个碰撞器作为复合碰撞器,将它们添加到一个空的GameObject,然后将它们放在另一个标签中,这样你就可以从脚本中忽略它们。
碰撞发生了两次吗?
只有您可以回答这个问题,因为现场就在您面前。
替换:
Debug.Log("...........................Collision");
与
Debug.Log("Collision: " + gameObject.name);
如果两个日志中GameObjects的名称相同,则为是,可能会发生两次。
答案 1 :(得分:0)
我认为这可能与网状对撞机有关。我遇到了同样的问题,当我将网格对撞机更改为盒对撞机时,问题就消失了。我对此的猜测是网格碰撞器中的多条碰撞线。试试看。