一直困惑於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 選項未勾選