一直困惑于unity3d中的触发和碰撞消息在什么条件下可以发生,平时用时也是只知其一;不知其二。磨刀不误砍柴工,是时候发点时间一劳永逸的解决这个问题了XD。ide
OnTriggerEnter, OnTriggerStay, OnTriggerExit 是为触发类消息,记为triggerspa
OnCollisionEnter, OnCollisionStay, OnCollisionExit是为碰撞类消息, 记为collision3d
None表示两类消息都没发生orm
若是对象有刚体(rigidbody)且其 IsKinematic 选项勾选,则记为KT,不然记为KF对象
若是对象有碰撞体(collider)且其 IsTrigger 选项勾选,则记为TT,不然记为TFit
(KT,TT)表示对象有刚体组件且其IsKinematic选项勾选,有碰撞体组件且其IsTrigger选项勾选io
(KT,TF)、(KF,TT)、(KF,TF)依此类推table
情形一,两个对象都只有刚体组件 :unity3d
KF | KT | |
KF | None | None |
KT | None | None |
能够看到没有消息产生db
情形二,两个对象都只有碰撞体组件:
TF | TT | |
TF | None | None |
TT | None | None |
能够看到也没有消息产生
情形三,一个对象有刚体组件和碰撞体组件,而另外一个对象只有碰撞体组件或只有刚体组件
(TF, KF) | (TF,KT) | (TT,KF) | (TT,KT) | |
TF | collision | None | trigger | trigger |
TT | trigger | trigger | trigger | trigger |
KF | None | None | None | None |
KT | None | None | None | None |
能够看到要产生消息须要两个对象都有碰撞体组件而且至少一个对象有刚体组件
情形四,两个对象都有刚体组件和碰撞体组件
(TF, KF) | (TF,KT) | (TT,KF) | (TT,KT) | |
(TF, KF) | collision | collision | trigger | trigger |
(TF,KT) | collision | None | trigger | trigger |
(TT,KF) | trigger | trigger | trigger | trigger |
(TT,KT) | trigger | trigger | trigger | trigger |
能够看到
要产生trigger消息:至少有一个碰撞体组件的 IsTigger 选项勾选
要产生collision消息:两个碰撞体组件的 IsTrigger 选项都未勾选且至少有一个刚体组件的 IsKinematic 选项未勾选
结论:
产生消息的基本条件:两个对象都有碰撞体组件而且至少一个对象有刚体组件
要产生trigger类消息:除知足基本条件外,至少有一个碰撞体组件的 IsTigger 选项勾选
要产生collision类消息:除知足基本条件外,两个碰撞体组件的 IsTrigger 选项都未勾选且至少有一个刚体组件的 IsKinematic 选项未勾选