OnCollisionEnter()在Unity3D中不起作用

我有一个带有网格对撞机的物体和一个带有球体对撞机的预制件。 如果两个碰撞碰撞,我希望预制件的实例被销毁。

我在脚本中写了以下内容:

private void OnCollisionEnter(Collision c) { if (c == target) Destroy(transform.gameObject); print("something"); // Doesn't get printed } 

但它没有用。 我试过在两个对象上切换isTrigger

我遇到了OnCollisionEnter未被调用的相同问题,并发现了这个问题。

对我来说,问题是我正在制作2D游戏,所以答案是使用OnCollisionEnter2D函数。

看看这张桌子

如果您想要调用OnCollisionEnter ,请确保:

(a)两个物体都附有对撞机。

(b)没有任何对象是触发器对撞机(这将发出OnTrigger函数而不是OnCollisionEnter)

(c)其中一个物体(无论其中哪一个)是刚性的,非运动的和非静态的物体(第二个物体不一定是刚体)。

(d)由于计算困难,MeshCollider可能很难与其他网格对撞机碰撞,请谨慎使用。

(e)确保两个对象都在同一层中。

示例colider配置

确保其中一个附有非运动刚性体。 取自Unity文档:

当两个碰撞器发生碰撞并且其中至少有一个碰撞有一个Rigidbody时 ,会向附着的物体发送三条碰撞消息。 这些事件可以在脚本中处理,并允许您创建独特的行为,无论是否使用内置的NVIDIA PhysX引擎。

从这里: Unity3D MeshCollider

您是否尝试过使用OnTriggerEnter()类并将对象上的对撞机设置为触发器?

如果它不需要告诉它与你碰撞的对象可以做一个简单的事情

 void OnTriggerEnter(){ Destroy(transform.gameObject); } 

编辑:

我也像这样做过OnCollision

 private string hitobject; void OnCollisionEnter(UnityEngine.Collision hit) { hitobject = hit.gameObject.tag; if(hitobject == "Plane") { isgrounded = true; } } 

没有任何对象是触发器,他们不需要笨拙的身体来工作。