我有一个带有网格对撞机的物体和一个带有球体对撞机的预制件。如果两个碰撞,我希望销毁预制件的实例。
我在脚本中写了以下内容:
private void OnCollisionEnter(Collision c)
{
if (c == target)
Destroy(transform.gameObject);
print("something"); // Doesn't get printed
}
但它不起作用。我试过在两个对象上切换isTrigger
。
答案 0 :(得分:19)
我有同样的问题OnCollisionEnter
没有被调用,发现了这个问题。
对我来说,问题是我正在制作2D游戏,所以答案是使用OnCollisionEnter2D
功能。
答案 1 :(得分:10)
如果您希望调用OnCollisionEnter
,请确保:
(a)两个物体都附有对撞机。
(b)没有任何对象是触发器对撞机(这将发出OnTrigger函数&而不是OnCollisionEnter)
(c)其中一个物体(与它们中的哪一个无关)是一种刚性的,非运动的物体。非静态物体(第二个不必是刚体)。
(d)由于计算困难,MeshCollider可能很难与其他网格对撞机碰撞,请谨慎使用。
(e)确保两个对象都在同一层中。
答案 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个单位可以解决此问题!