雖然Rigidbody 2D大致上可以看成是Rigidbody的2D化,大部分功能也是一致的,但是還是有一些細節問題。
一些事項:
1.任何添加到同一個 GameObject身上或者其子物體身上的 2D Collider組件都隱式的 附屬於 那個 Rigidbody 2D.
2.當一個Collider 2D組件附屬到一個Rigidbody 2D身上時,它就跟隨Rigidbody 2D移動。這時不應該通過直接設置Transform 或者 Collider的偏移量來 移動。
3.附屬於同一個 Rigidbody 2D的所有 Collider 2D,它們相互是不會發生碰撞檢測的。
剛體類型:
1. Rigidbody 2D 有三個類型:Dynamic、Kinematic、Static
2. 剛體類型主要影響一下幾個要素:
a. 移動行為(位置、旋轉)
b. 碰撞體交互
3. 注意一點,雖然Rigidbody 經常被描述成 是與其它 rigidbody 相互碰撞,但是實際上是 附加在Rigidbody上的Collider在進行碰撞檢測,Rigidbody在沒有Collider的情況下,是沒法相互碰撞的。
4. 改變Rigidbody 2D的類型是一個比較麻煩的事情。當一個剛體類型改變,許多關聯的變量會立馬重置,並且需要重新賦值,而且與剛體關聯的所有Collider需要在下一個FixiedUpdate之前重新認知,這樣可能會導致奇怪的表現。
剛體類型: Dynamic
概括來說,這種類型是為了 物理仿真運動而設計的。(讓物體看起來更像現實世界行為)它的運動受重力、質量、其他力影響。並且這種類型會與其他所有剛體類型發生碰撞。
- Simulated:該組件是否與仿真模擬交互。
- Collision Detection:碰撞體之間的碰撞檢測方式:
- Discrete:在一個 物理更新期間,物理可以相互重疊、穿越。當速度太快時,碰撞只會在最新的位置檢測,這就意味着,如果速度太快,使用這個選項會有問題。
- Continuous:這個就不會存在Discete的問題,但是CPU消耗高。
- Sleeping Model:在什么情況下,會休眠以節省性能。
- Never Sleep:從不休眠
- Start Awake:物體最初是醒着的
- Start Asleep:物體最初是休眠的,但是遇到碰撞就會蘇醒。
- Interpolate:在物理更新中,物體移動的插值算法
- None:
- Interpolate:基於上一幀物體位置來插值模擬
- Extrapolate:基於預測下一陣物體位置來插值模擬
剛體類型:Kinematic
這種類型,物體移動也是在仿真下進行的,但是卻是在 用戶非常明確的控制 的前提下進行的。
注意
1. 這種類型不受力、重力的影響
2. 它使用Rigidbody2D.MovePosition or Rigidbody2D.MoveRotation API來移動。
3. 它使用物理引擎來查詢 碰撞,並且通過編程來決定物體如何移動。
4. 實際上,這種類型仍然通過它的速度來移動,但是它的速度卻不受其他任何力的影響。
5. 這種類型 不會 與其它Kinematic或者Static類型發生碰撞檢測
6. 在碰撞過程中,這種類型的物體表現為不受力(質量無窮大)。
- Simulated:如果想要在運行時 與其它Collider 2D 發生物理仿真交互,就打開它。
- Use Full Kinematic Constacts:開啟它,該物體就可以與其它任意類型的Rigidbody 2D發生碰撞。
剛體類型:Static
1. 它只與 Dynamic 類型的Rigidbody 發生碰撞.
2. 無法擁有兩個 Static 的Rigidbody 2D。