主要參照 Unity 官方文檔的如下幾篇文章,從新進行了整理。 docs.unity3d.com/Manual/Phys… docs.unity3d.com/Manual/clas… docs.unity3d.com/Manual/clas…html
Unity 物理系統中,剛體用於接受各類力的做用,具備速度,來控制物體的移動。
碰撞體用於各個物體之間的交互、碰撞,從而影響物體的移動。
剛體一般和碰撞體一塊兒使用,模擬現實中的世界。ide
剛體
- 會受到重力等力的做用,而產生移動,可是不會發生形變。
- 加了剛體的物體,不該該經過 Transform 來 move、rotate、scale。應該經過 Rigidbody.MovePosition、Rigidbody.MoveRotation、Rigidbody2D.MovePosition、Rigidbody2D.MoveRotation 來移動。
剛體類型 BodyType
剛體類型是剛體的一個重要屬性。函數
- 決定移動的行爲(位置、翻轉)
- (若是有碰撞體組件的話)決定碰撞交互的方式
- 改變 BodyType 是一個很消耗性能的操做
有以下 3 種類型。 性能
動態 Dynamic
- 默認類型
- 受重力和附加力的影響,進而改變速度。
- 性能消耗最高的類型。
- 可經過 MovePosition、MoveRotation 來移動。
- 可經過 velocity 來改變速度。
- 用來模擬移動的物體。
運動學 Kinematic
- 不受力的影響。
- 性能消耗比 Dynamic 少,比 Static 多。
- 可經過 MovePosition MoveRotation 來移動。
- 可經過 velocity 來改變速度。
- 用來模擬大多數時候不動的物體,極少數時候須要移動。好比門。
靜態 Static
- 不受力的影響,物理系統不會對該物體進行計算。
- 性能消耗最低的類型。
- 不可經過 MovePosition MoveRotation 來移動。
- 不可經過 velocity 來改變速度。
- 用來模擬從不移動的物體。
在 Physics2D 中設置剛體類型
Physics2D 中 Rigidbody2D 組件有 BodyType 屬性,沒有 IsKinematic 屬性。優化
- Dynamic:添加 Rigidbody2D,設置 BodyType 爲 Dynamic。
- Kinematic:添加 Rigidbody2D,設置 BodyType 爲 Kinematic。
- Static:
- 添加 Rigidbody2D,設置 BodyType 爲 Static。
- 不添加 Rigidbody2D 組件,可是有 Collider2D 組件。至關於有一個隱藏的 Static Rigidbody2D。
- 比較簡單,不用另外添加剛體,並設置類型。
- 效率不如明確添加剛體的方式。
在 Physics3D 中設置剛體類型
Physics3D 中 Rigidbody 組件有 IsKinematic 屬性,沒有 BodyType 屬性。3d
- Dynamic:添加 Rigidbody,不勾選 IsKinematic。
- Kinematic:添加 Rigidbody,勾選 IsKinematic。
- Static:不添加 Rigidbody,可是有 Collider 組件。
碰撞體
- 會發生碰撞,並由於碰撞而移動。
- 定義 GameObject 的形狀以用於碰撞檢測,會觸發相應的碰撞體回調函數。
- 碰撞體是不可見的,碰撞體的形狀不用和實際的網格(mesh)形狀一致。
與 3 種類型的剛體對應,碰撞體根據添加的剛體類型,也有 3 種類型的碰撞體。 orm
靜止剛體的碰撞體 Static Rigidbody Collider
- 有碰撞體
- 不受力和碰撞的影響
- 能夠和其餘碰撞體發生碰撞,可是本身不會移動。物理系統會作優化。
- 遊戲過程當中儘可能避免 enable、disable、move、scale,不然會有大的性能消耗,甚至出現錯誤。
- 若是大部分時候是靜止的,可是某些狀況下須要移動,那麼應該使用 Kinematic Rigidbody Collider。
動態剛體的碰撞體 Dynamic Rigidbody Collider
- 有碰撞體,有剛體,剛體類型是 Dynamic。
- 最經常使用的,會受到力和碰撞的影響。
運動學剛體的碰撞體 Kinematic Rigidbody Collider
- 有碰撞體,有剛體,剛體類型是 Kinematic。
- 能夠經過 Transform 來移動位置
- 不受力和碰撞的影響
- 偶爾會被 move、enable、disable,大多數時候和 Static Collider 一致。
觸發器
- 碰撞體勾選 isTrigger 後成爲觸發器
- 與碰撞體的主要區別
- 其餘碰撞體能夠穿過該(觸發器)碰撞體,不會受到阻擋。
- 穿過該碰撞體時,會觸發相應的觸發器回調函數。
- 與 3 種類型的碰撞體對應,勾選 isTrigger 後對應 3 種類型的觸發器。
碰撞體碰撞規則
- Dynamic 剛體的碰撞體和其餘碰撞體,會有回調。
Collision detection occurs and messages are sent upon collision |
|
|
|
|
|
|
|
Static Rigidbody Collider |
Dynamic Rigidbody Collider |
Kinematic Rigidbody Collider |
Static Rigidbody Trigger Collider |
Dynamic Rigidbody Trigger Collider |
Kinematic Rigidbody Trigger Collider |
Static Rigidbody Collider |
|
Y |
|
|
|
|
Dynamic Rigidbody Collider |
Y |
Y |
Y |
|
|
|
Kinematic Rigidbody Collider |
|
Y |
|
|
|
|
Static Rigidbody Trigger Collider |
|
|
|
|
|
|
Dynamic Rigidbody Trigger Collider |
|
|
|
|
|
|
Kinematic Rigidbody Trigger Collider |
|
|
|
|
|
|
碰撞體相關回調函數
- MonoBehaviour
- OnCollisionEnter2D(Collider2D)
- OnCollisionStay2D(Collider2D)
- OnCollisionExit2D(Collider2D)
- OnCollisionEnter(Collider)
- OnCollisionStay(Collider)
- OnCollisionExit(Collider)
觸發器觸發規則
- Dynamic、Kinematic 剛體的觸發器,和任何碰撞體、觸發器都會有回調。
- Static 剛體的觸發器碰撞體,只能和 Dynamic、Kinematic 剛體的碰撞體、觸發器有回調。
Trigger messages are sent upon collision |
|
|
|
|
|
|
|
Static Rigidbody Collider |
Dynamic Rigidbody Collider |
Kinematic Rigidbody Collider |
Static Rigidbody Trigger Collider |
Dynamic Rigidbody Trigger Collider |
Kinematic Rigidbody Trigger Collider |
Static Rigidbody Collider |
|
|
|
|
Y |
Y |
Dynamic Rigidbody Collider |
|
|
|
Y |
Y |
Y |
Kinematic Rigidbody Collider |
|
|
|
Y |
Y |
Y |
Static Rigidbody Trigger Collider |
|
Y |
Y |
|
Y |
Y |
DynamicRigidbody Trigger Collider |
Y |
Y |
Y |
Y |
Y |
Y |
Kinematic Rigidbody Trigger Collider |
Y |
Y |
Y |
Y |
Y |
Y |
觸發器相關回調函數
- MonoBehaviour
- OnTriggerEnter2D(Collider2D)
- OnTriggerStay2D(Collider2D)
- OnTriggerExit2D(Collider2D)
- OnTriggerEnter(Collider)
- OnTriggerStay(Collider)
- OnTriggerExit(Collider)
其餘細節
休眠
- 當剛體移動速度小於一個特定值後,就會進入休眠狀態(Sleeping)。以下降性能消耗。
- 休眠狀態下,
- 不會參與物理系統的計算。
- 發生碰撞或者受到力的做用,會從新參與物理系統的計算。
- 若是有靜態碰撞體經過 Transform 來移動,並接觸/離開一個 Sleeping 的剛體,該剛體不會從新參與計算,可能會懸浮在空中,發生不可預知的錯誤。此時須要經過 WakeUp 來喚醒。理論上不該該移動靜態碰撞體,也就不會出現這種狀況。