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)确保两个对象都在同一层中。
确保其中一个附有非运动刚性体。 取自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; } }
没有任何对象是触发器,他们不需要笨拙的身体来工作。