Unity BoxCollider、isTrigger、Rigidbody、isKinematic的關係

前些日子再研究Unity中的BoxCollider中的isTrigger與Rigidbody還有isKinematic的關係

本來都看懂了,結果幾天沒碰又忘了,為了不再讓自己忘記,特地在此記錄下來

如有誤還請指教

 

以下將各別測試A物件以及B物件實裝BoxCollider或Rigidbody,

以及BoxCollider中的isTrigger有沒有打勾,所產生的各種情形

 

A與B只有BoxCollider,A與B的isTrigger無論有沒有打勾

A撞B或B撞A皆不會發生事件

 

A有Rigidbody跟BoxCollider

B有BoxCollider

A跟B的isTrigger皆沒打勾

A撞B,A與B皆會發生OnCollisionEnter、OnCollisionStay、OnCollisionExit等事件

B撞A,A與B皆不會發生事件

且A撞上B時就會停住,可以想像成撞到牆壁停止。

B撞A的話則會直接穿越。

 

A有Rigidbody跟BoxCollider

B有BoxCollider

A或B只要有一方的isTrigger打勾,或者是雙方皆打勾

A撞B或B撞A,A與B皆會發生OnTriggerEnter、OnTriggerStay、OnTriggerExit等事件

且A跟B不會有碰撞情形,A撞B的話A會穿越B,B撞A也是。

 

A有Rigidbody跟BoxCollider

B有Rigidbody跟BoxCollider

A與B的isTrigger皆沒打勾

A撞B或B撞A,A與B皆會發生OnCollisionEnter、OnCollisionStay、OnCollisionExit等事件

且A撞上B時會推動B。

B撞A的話則會推動A。

 

A有Rigidbody跟BoxCollider

B有Rigidbody跟BoxCollider

A或B只要有一方的isTrigger打勾,或者是雙方皆打勾

A撞B或B撞A,A與B皆會發生OnTriggerEnter、OnTriggerStay、OnTriggerExit等事件

且A跟B不會有碰撞情形,A撞B的話A會穿越B,B撞A也是。

 

結論:

想要產生碰撞事件以及物理行為,則衝撞的一方必須要有Rigidbody跟BoxCollider,

且衝撞跟被撞的isTrigger皆不能打勾。

只要有一方的isTrigger打勾,那只會發生Trigger事件,並且物體只會穿越,不會發生物理的碰撞行為

如果衝撞的一方有Rigidbody,被撞的一方沒有,則衝撞的一方撞上後會停下來,可以想像成撞到牆壁

如果衝撞跟被撞的一方皆有Rigidbody,則碰撞後雙方皆會發生物理行為,例如A撞B後,B會被推動。

 

isTrigger打勾與否的用法,在網路上有看到一個例子

例如自動門的前面可以放一個隱形的BoxCollider,暫且稱為X,將X的isTrigger打勾

那麼當有人經過X時,則會觸發trigger事件,我們可以將開門的程式碼寫在X的Trigger事件裡

這樣一來只要有人經過X,就可以觸發開啟自動門的流程

且由於X的isTrigger有打勾,因此也不會發生將X給”撞”走的物理情況

只會穿越X而已。

 

 

那麼接下來測試如果加上Rigidbody中的isKinematic的情況

A有BoxCollider,也有Rigidbody且isKinematic打勾

B有BoxCollider跟Rigidbody

A與B的isTrigger皆打勾,

A撞B或B撞A,A與B皆會發生OnCollisionEnter、OnCollisionStay、OnCollisionExit等事件

但A撞B會推動B,B撞A卻會像撞到牆壁一樣停止

上述情況如果A與B的isKinematic皆打勾,那麼A與B只會互相穿越,且不會觸發任何事件

 

A有BoxCollider,也有Rigidbody且isKinematic打勾

B有BoxCollider

無論A撞B或者B撞A,皆會發生穿越的情形,且不會觸發任何事件

 

而isKinematic打勾與否的用法,我們用電梯來舉例

假設電梯物件沒有Rigidbody的話,那麼人物物件雖然可以踩在電梯上,

可是是電梯上升時只會穿越人物,並不會推動人物一起上升

但如果電梯有Rigidbody,可是isKinematic沒打勾,

這時電梯雖然上升時可以推動人物,可是同樣的人物也可以推動電梯,而這並非符合現實世界的狀況

如果將電梯的isKinematic打勾,

電梯上升時即可以推動人物,而人物則無法推動電梯,而這才是我們想要的效果。

 

 

Leave a Reply

你的電子郵件位址並不會被公開。 必要欄位標記為 *