OnCollisionEnter()在Unity3D中不起作用

时间:2013-08-16 20:09:45

标签: c# unity3d

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

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

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

但它不起作用。我试过在两个对象上切换isTrigger

5 个答案:

答案 0 :(得分:19)

我有同样的问题OnCollisionEnter没有被调用,发现了这个问题。

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

答案 1 :(得分:10)

查看this table

如果您希望调用OnCollisionEnter,请确保:

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

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

(c)其中一个物体(与它们中的哪一个无关)是一种刚性的,非运动的物体。非静态物体(第二个不必是刚体)。

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

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

example colider configuration

答案 2 :(得分:5)

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

  

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

从这里开始:Unity3D MeshCollider

答案 3 :(得分:1)

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

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

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

编辑:

我也像这样做过OnCollision

private string hitobject;

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

没有任何对象是触发器,他们也不需要使用滑体来工作。

答案 4 :(得分:1)

我有类似的问题。盒子碰撞器不像碰撞对象那么大。将x和z值设置为2个单位可以解决此问题!