一直困惑于unity3d中的触发和碰撞消息在什么条件下能够发生,平时用时也是一知半解。磨刀不误砍柴工,是时候发点时间一劳永逸的解决这个问题了XD。
OnTriggerEnter, OnTriggerStay, OnTriggerExit 是为触发类消息,记为trigger
OnCollisionEnter, OnCollisionStay, OnCollisionExit是为碰撞类消息, 记为collision
None表示两类消息都没发生
如果对象有刚体(rigidbody)且其 IsKinematic 选项勾选,则记为KT,否则记为KF
如果对象有碰撞体(collider)且其 IsTrigger 选项勾选,则记为TT,否则记为TF
(KT,TT)表示对象有刚体组件且其IsKinematic选项勾选,有碰撞体组件且其IsTrigger选项勾选
(KT,TF)、(KF,TT)、(KF,TF)依此类推
- 情形一,两个对象都只有刚体组件 :
KF | KT | |
KF | None | None |
KT | None | None |
可以看到没有消息产生
- 情形二,两个对象都只有碰撞体组件:
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 选项未勾选
时间: 2024-12-29 11:26:46