18

我有一个带有网格碰撞器的对象和一个带有球体碰撞器的预制件。如果两者发生碰撞,我希望预制件的实例被破坏。

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

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

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

4

5 回答 5

38

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

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

于 2015-11-21T20:03:20.963 回答
32

看看这张表

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

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

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

(c) 其中一个对象(不管它们中的哪一个)是刚性的、非运动学的和非静态的对象(第二个不必是刚体)。

(d) 由于计算困难,MeshCollider 可能很难与其他网格碰撞器发生碰撞,请谨慎使用它们。

(e) 确保两个对象在同一层中(或者至少它们在场景设置中发生碰撞)。

(f) 如果您在 2d 中工作 -OnCollisionEnter2D将被调用,请重命名您的函数。

示例 colider 配置

于 2017-12-13T21:58:21.333 回答
7

确保其中一个连接了非运动刚体。取自 Unity 文档:

当两个 Collider 之间发生碰撞并且其中至少一个附加了 Rigidbody时,将向附加到它们的对象发送三个碰撞消息。这些事件可以在脚本中处理,并允许您在使用或不使用内置 NVIDIA PhysX 引擎的情况下创建独特的行为。

从这里开始:Unity3D MeshCollider

于 2013-08-16T20:51:57.370 回答
2

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

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

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

编辑:

我也做过这样的 OnCollision

private string hitobject;

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

这些对象都不是触发器,它们不需要刚体来工作。

于 2013-08-22T05:41:37.190 回答
1

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

于 2019-06-04T21:25:05.160 回答