Unity 物理系統之剛體、碰撞體、觸發器

主要參照 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

  • 有碰撞體
    • 沒有剛體
    • 或者剛體類型爲 Static。
  • 不受力和碰撞的影響
  • 能夠和其餘碰撞體發生碰撞,可是本身不會移動。物理系統會作優化。
  • 遊戲過程當中儘可能避免 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 來喚醒。理論上不該該移動靜態碰撞體,也就不會出現這種狀況。
相關文章
相關標籤/搜索