??Rigidbody 2D組件將對象置于物理引擎的控制之下。許多熟悉的概念從標準剛體組件(standard Rigidbody component)繼承到Rigidbody 2D組件;不同之處在于在2D中,對象只能在XY平面上移動,只能在垂直于XY平面的軸(Z軸)上旋轉。
Rigidbody 2D 是怎么工作的???
??通常,Unity編輯器的Transform組件定義了游戲對象(及其子對象)在場景中的位置,旋轉和縮放。當Transform發(fā)生改變時,它會去更新其他的組件來確保渲染的位置或者碰撞器的位置。
??2D物理引擎能夠移動碰撞器并使其相互作用,因此物理引擎需要一個方法將碰撞器的運動傳遞給Transform,這種移動和與碰撞器的連接是Rigidbody 2D組件的用途。
??Rigidbody 2D組件會覆蓋Transform并將其更新為Rigidbody 2D定義的位置/旋轉。請注意,雖然您仍然可以通過自己修改Transform組件來覆蓋Rigidbody 2D(因為Unity公開了所有組件上的所有屬性),但這樣做會導致GameObjects相互傳遞或相互進入等問題,以及不可預測的移動。
??當Collider 2D附著在Rigidbody 2D上時,不應該使用Transform或any collider offset(任何碰撞器偏移)直接移動Collider 2D; 應該移動Rigidbody 2D。這確保最佳性能并確保正確碰撞檢測。
Body Type
根據Body Type屬性選擇的不同,界面會有不同的屬性呈現(xiàn)。
??Body Type有三種選擇; 每個定義一個共同的行為和屬性。任何連接到Rigidbody 2D的Collider 2D都會繼承Rigidbody 2D的Body Type。
- Dynamic
- Kinematic
- Static
??注意:盡管Rigidbody 2Ds經常被描述為相互碰撞,但碰撞的每個物體都必須附有Collider 2D。沒有碰撞器,剛體2D不會相互碰撞。(Rigidbody 2D只需要一方有就可以發(fā)生碰撞)
??改變Rigidbody 2D的Body Type可能是一個棘手的過程。當“Body Type”發(fā)生變化時,會立即重新計算各種與質量相關的內部屬性,并且需要在GameObject的下一個FixedUpdate中重新評估連接到Rigidbody 2D上的Collider 2Ds的所有現(xiàn)有接觸點。根據與身體連接的接觸點和Collider 2D的數(shù)量,改變Body Type會導致性能的變化。
Body Type: Dynamic

??Dynamic 是模擬Rigidbody 2D在仿真環(huán)境下運動,擁有真實的屬性:有限質量和阻力,受重力和外力影響。會與其他每個Body Type類型的GameObject相撞,最具有互動性。也是Rigidbody 2D默認的類型,是移動的場景類型,但也是性能消耗最大的類型。因為它具有動態(tài)性和與周圍物體的互動性。此體型可以使用所有Rigidbody 2D屬性。
??不要使用“Transform”組件來設置Dynamic Rigidbody 2D 的位置或旋轉。模擬根據其速度重新定位動態(tài)剛體2D; 您可以通過腳本應用的力直接更改,或通過碰撞和重力間接。
- Body type:設置Rigidbody 2D的Body類型,以便您可以操縱運動(位置和旋轉)和Collider 2D交互行為。
- Material:物體材質;使用它為附加到特定父Rigidbody 2D上的所有Collider 2Ds指定一個公共材質。
說明:A Collider 2D uses the following order of priority to determine which Material setting to use: (使用物理材質的順序)
- A Physics Material 2D specified on the Collider 2D itself.(優(yōu)先使用collider上面的)
- A Physics Material 2D specified on the attached Rigidbody 2D.(如果collider上面不存在,再使用Rigidbody 2D上面的材質,如果沒有使用None默認材質)
-
Simulated:啟動物理模擬,gameobject收到重力和相關力作用,對Collider 2D和Joint 2D進行約束。
注意:當不需要模擬某個gameobject的物理行為時,取消模擬比Disable Rigidbody 2D組件要好,原因如下(原文檔內容:大意是使用取消模擬相比于Disable Rigidbody 2D不需要額外的時間和空間開銷)
reason Use Auto Mass:勾選后,Rigidbody 2D從其Collider 2D中自動檢測GameObject的質量。
Mass:定義Rigidbody 2D的質量。如果選擇了使用Use Auto Mass(自動質量),它將顯示為灰色。
Linear Drag:線性阻力系數(shù),影響線性運動的阻力系數(shù)
Angular Drag:角阻力系數(shù),影響旋轉運動的阻力系數(shù)
Gravity Scale:定義GameObject受重力影響程度
Collision Detection:定義如何檢測Collider 2D之間的碰撞
1.Discrete:將碰撞檢測設置為離散,如果物理更新過程中移動速度足夠快,則具有Rigidbody 2D和Collider 2D的游戲對象可以重疊或相互穿過。碰撞觸點僅在新位置生成。
2.Continuous:將碰撞檢測設置為連續(xù),具有Rigidbody 2D和Collider 2D的游戲對象在更新期間不會相互通過。相反,Unity會計算任何Collider 2D的第一個影響點,并將GameObject移動到那里。請注意,這比Discrete需要更多的CPU時間。Sleeping Mode:定義GameObject如何“休眠”以在處于靜止狀態(tài)時節(jié)省處理器時間。
1.Never Sleep:禁用睡眠(應盡可能避免選擇Never Sleep,因為它可能會影響系統(tǒng)資源)。
2.Start Awake:GameObject最初是清醒的。
3.Start Asleep:GameObject最初是休眠的,但可以被碰撞喚醒。Interpolate:定義如何在物理更新之間插值GameObject(游戲物體)的運動(當運動趨于不穩(wěn)定時很有用)。
1.None:沒有插值運算
2.Interpolate:根據GameObject在先前幀中的位置對運動進行平滑處理。
3.Extrapolate:基于其在下一幀中的位置的估計來平滑運動。Constraints:定義Rigidbody 2D運動的任何限制。
1.Freeze Position:有選擇地停止Rigidbody 2D在世界X和Y軸上的移動。
2.Freeze Rotation:選擇性地停止圍繞Z軸旋轉的Rigidbody 2D。
Body Type: Kinematic

??與Dynamic Rigidbody 2D 相比,Kinematic Rigidbody 2D不受重力和力的影響,對系統(tǒng)資源的需求很低。Kinematic Rigidbody 2D設計為通過Rigidbody2D.MovePosition或Rigidbody2D.MoveRotation顯式重新定位。使用物理查詢來檢測碰撞,并使用腳本來確定Rigidbody 2D應該移動的位置和方式。
??Kinematic Rigidbody 2D仍然通過速度運動,但速度不受力或重力的影響。Kinematic Rigidbody 2D不與其他Kinematic Rigidbody 2D碰撞,也不與Static Rigidbody 2D碰撞;它只與Dynamic Rigidbody 2D 碰撞。Kinematic Rigidbody 2D在碰撞過程中表現(xiàn)得像一個不可移動的物體(仿佛它有無限的質量)。與質量相關的屬性在這種身體類型中是不可用的。
相比于Dynamic Rigidbody 2D ,Kinematic Rigidbody 2D有一個單獨的屬性:
- Use Full Kinematic Contacts:使用全運動觸點,Kinematic Rigidbody 2D will collide with all Rigidbody 2D Body Types(Kinematic Rigidbody 2D與所有類型的Rigidbody 2D產生碰撞);但是發(fā)生碰撞時Kinematic Rigidbody 2D不會移動,這是一個具有無限質量的物體。
Body Type: Static

??如果有任何碰撞,Static Rigidbody 2D的行為就像一個不可移動的物體(好像它有無限質量)。它也是使用資源最少的身體類型。
A Static body only collides with Dynamic Rigidbody 2Ds
一個Static Rigidbody 2D僅與Dynamic Rigidbody 2Ds發(fā)生碰撞。不支持兩個Static Rigidbody 2D碰撞,因為它們不是為了移動而設計的。
有兩種方法可將Rigidbody 2D標記為靜態(tài):
1.對于具有Collider 2D組件的GameObject,根本不具有Rigidbody 2D組件。所有這些Collider 2D都在內部被認為是附加到單個隱藏的Static Rigidbody 2D組件。
2.對于GameObject來說,要有一個Rigidbody 2D并且要將Rigidbody 2D設置為Static。
??注意:Static Rigidbody 2Ds and Kinematic Rigidbody 2Ds will interact(交互) with each other if one of their Collider 2Ds is set to be a trigger. 這里會和Use Full Kinematic Contacts屬性所說的有 “沖突”嗎? 如果Kinematic Rigidbody 2D不勾選Use Full Kinematic Contacts屬性,還可以和Static Rigidbody 2D交互嗎?答案是肯定的,因為這里勾選Trigger走的是觸發(fā)器規(guī)則(不是走的碰撞器規(guī)則),不會發(fā)生沖突腳本回調(OnCollisionEnter,OnCollisionStay,OnCollisionExit)。
總結:
- Dynamic Rigidbody 2D :受重力和力的作用,最消耗資源,具有互動性
- Kinematic Rigidbody 2D:不受重力和力的作用,相對節(jié)約資源,僅僅只和Dynamic Rigidbody 2D有互動性(變現(xiàn)得像一個具有無限質量的物體)。(勾選Trigger或勾選Use Full Kinematic Contacts是兩回事,別弄混了)
- Static Rigidbody 2D:消耗資源最少,僅和Dynamic Rigidbody 2D有互動性(變現(xiàn)得像一個具有無限質量的物體)

