NO IMAGE

正文:

剛體能讓你的遊戲物件被物理引擎所控制,它能通過受到推力和扭力來實現真實的物理表現效果。所有遊戲物件必須包含剛體元件來實現重力、通過指令碼施加力、或者與其他物件進行互動,這一切都通過NVIDIA的PhysX物理引擎來實現。

屬性

Mass 質量,單位為Kg,建議不要讓物件之間的質量差達到100倍以上

Drag 空氣阻力,為0表示沒有阻力,infinity表示立即停止移動

Angular Drag 扭力的阻力,數值意義同上

Use Gravity 是否受重力影響

Is Kinematic 是否為Kinematic剛體,如果啟用該引數,則物件不會被物理所控制,只能通過直接設定位置、旋轉和縮放來操作它,一般用來實現移動平臺,或者帶有HingeJoint的動畫剛體

Interpolate 如果你的剛體運動時有抖動,嘗試一下修改這個引數,None表示沒有插值,Interpolate表示根據上一楨的位置來做平滑插值,Extrapolate表示根據預測的下一楨的位置來做平滑插值

Freeze Rotation 如果選中了該選項,那麼剛體將不會因為外力或者扭力而發生旋轉,你只能通過指令碼的旋轉函式來進行操作

Collision Detection 碰撞檢測演算法,用於防止剛體因快速移動而穿過其他物件

Constraints 剛體運動的約束,包括位置約束和旋轉約束,勾選表示在該座標上不允許進行此類操作

詳細描述
剛體讓你的遊戲物件處於物理引擎的控制之下,這開啟了實現真實碰撞,各種連線型別,以及其他各種效果的大門。通過給剛體施加外力來移動它,與以前的通過設定其位置變換來移動它有非常大的不同。通常情況下,你不會同時操作剛體和變換,你只會使用其中之一。

這兩者之間最大的差異在於力(Forces)的使用,剛體能接受推力和扭力,變換不可以。變換同樣可以實現位置變化與旋轉,但這與通過物理引擎來實現是不一樣的。給剛體施加力來移動他的時候同時也會影響物件的變換數值,這也是為什麼只能使用這兩者之一的原因,如果同時直接操作了剛體的變換,那麼在執行碰撞和其他操作的時候會出問題。

你必須顯示的將剛體元件新增到你的遊戲物件上,通過選單項 Component -> Physics -> Rigidbody即可新增,之後物件就處於物理引擎控制之下了,他會受到重力的影響而下落,也能夠通過指令碼來受力,不過你可能還需要新增一個Collider或者Joint來讓他表現的更像你所期望的。

Parenting
當一個物件處於物理引擎控制之下,他的運動將會與其父物件的移動半獨立開。如果你移動任意的父物件,他們將會拉動剛體子物件,然而,剛體在重力及碰撞影響下還會下落。

Scripting
控制剛體的方法主要是通過指令碼來施加推力和扭力,通過在剛體物件上呼叫AddForce()和AddTorque()方法。再次注意,當你使用物理引擎來控制剛體的時候,不要直接操作物件的變換數值。

Animation
在某些時候,主要是建立紙娃娃效果的時候,你可能需要在動畫與物理控制之間進行切換。你可以將剛體設定為IsKinematic,當設定為Kinematic模式,它將不再受到外力影響。這時你只能通過變換方式來操作物件,但是Kinematic剛體還會影響其他剛體,但他自己不會再受物理引擎控制。比如,連在Kinematic剛體上的Joints還會繼續影響連線的另一個非Kinematic剛體,同時也能夠給其他剛體產生碰撞力。

Colliders
碰撞體是另一類必須手動新增的的元件,用來讓物件能夠發生碰撞。當兩個剛體接觸到一起的時候,除非兩個剛體都設定了碰撞屬性,否則物理引擎是不會計算他們的碰撞的。沒有碰撞體的剛體在進行物理模擬的時候將會簡單的穿過其他剛體。

Composed Colliders
由多個基本的碰撞體物件組合而成,扮演一個獨立的碰撞體物件。當你有一個複雜的模型,而你又不能使用Mesh Collider的時候就可以使用組合碰撞體。

Continuous Collision Detection
CCD用來防止快速移動的物體穿過其他物件。

當使用預設的離散式碰撞檢測時,如果前一楨時物件在牆這一面,下一楨時物件已到到了牆另一面,那麼碰撞檢測演算法將檢測不到碰撞的發生,你可以將該物件的碰撞檢測屬性設定為Continuous,這時碰撞檢測演算法將會防止物件穿過所有的靜態碰撞體,設定為Continuous Dynamic將還會防止穿過其他也設定為Continuous或者Continuous Dynamic的剛體。

CCD只支援Box,Sphere和Capsule的碰撞體。

Use The Right Size
當使用物理引擎的時候,遊戲物件的大小比剛體的質量更重要。如果你發現剛體的行為不是你所期望的,比如移動的太慢,漂浮,或者不能正確的進行碰撞,嘗試一下修改你的模型的縮放值。Unity的預設單位是1 unit = 1 米,物理引擎的計算也是按照這個單位來的。比如,一個摩天大樓的倒塌與一個由積木搭成的玩具房子的倒塌是完全不一樣的,所以,不同大小的物件在建模時都應該按照統一的比例。

對於一個人類角色模型來說,他應該有2米高。可以建立一個Box來作為參照物,預設的Box為1米,所以一個角色應該是Box的兩倍高。

當然,你也可以通過修改匯入模型的縮放來調整比例,如果你不能直接修改模型本身的話。在Project面板中選中模型,調整其Importer屬性,注意不是變換裡的縮放。

如果你的遊戲需要你例項化具有不同縮放值的物件,你也可以調整變換裡的縮放值,但是物理引擎來建立這個物件的時候會額外多做一點工作,這可能會引起一點效能問題。

這個問題不會太嚴重,但效能顯然會比上面兩種方法低。

同樣要注意的是,non-uniform scales也會引起一些問題,如果這個物件具有父物件的話。基於以上原因,儘可能的在製作模型的時候就按照Unity的比例來建模。

Hints
兩個剛體的相對質量決定他們在碰撞的時候將會如何反應。

給剛體設定更大的質量並不會讓它下降的更快,如果要實現這個目的,使用Drag引數。

低的阻力值使得物件看起來更重,高的阻力值使物件看起來更輕。

典型的Drag值介於0.001(固體金屬)到10(羽毛)之間。

如果你想同時使用變換和物理來控制物件,那麼給他一個剛體元件並將其設定為Kinematic

如果你通過變換來移動物件,同時又想收到物件的碰撞訊息,那麼必須給他一個剛體元件。

Mass(質量):
學過物理的同學們都知道的吧,質量越大,慣性越大。這裡的單位可以自己統一規定,但是官方給出的建議是場景中的物體質量最好不要相差100倍率以上。估計是防止兩個質量相差太大的物體碰撞後會產生過大的速度,從而影響遊戲效能吧。Drag(阻力):這裡指的是空氣阻力,當遊戲物體收到某個作用力的時候,這個值越大越難移動。如果設定成無限的話,物體會立即停止移動。Angular Drag(角阻力):
同樣指的是空氣阻力,只不過是用來阻礙物體旋轉的。如果設定成無限的話,物體會立即停止旋轉。Use Gravity(使用重力):
勾選了這個項,遊戲物件就會受到重力影響。Is Kinematic(是否動態):
勾選這個選項會使遊戲物件不受物理引擎的影響,但這不等同於沒有剛體元件。這通常用於需要用動畫控制的剛體,這樣就不會因為慣性而影響動畫了。Interplate(差值型別):如果看到剛體移動的時候一直抽風或者運動的不是很平滑,可以選擇一種平滑方式:
None(無差值):不使用差值平滑。
Interpolate(差值):根據上一幀來平滑移動。
Extrapolate(推算):根據推算下一幀物體的位置來平滑移動。Collision Detection(碰撞檢測方式):
Discrete(離散):預設的碰撞檢測方式。但若當物體A運動很快的時候,有可能前一幀還在B物體的前面,後一幀就在B物體後面了,這種情況下不會觸發碰撞事件,所以如果需要檢測這種情況,那就必須使用後兩種檢測方式。
Continuous(連續):這種方式可以與有靜態網格碰撞器的遊戲物件進行碰撞檢測。
Continuous Dynamic(動態連續):這種方式可以與所有設定了2或3方式的遊戲物件進行碰撞檢測。Freeze Position/Rotation(凍結位置/旋轉):
可以對物體在X、Y、Z三個軸上的位置/旋轉進行鎖定,即使受到相應的力也不會改變,但可以通過指令碼來修改。

最後順便再提一下恆力元件(Constant Force),由於比較容易理解我就不做詳細介紹了。一共有4個引數,分別是Force/Relative Force(世界/相對作用力)、Torque/Relative Torque(世界/相對扭力)。這些引數代表了附加在剛體上的XYZ軸方向恆力的大小,另外還要注意必須是剛體才可以新增恆力。有興趣可以自己嘗試一下給物體一個Y軸方向的力,物體就會像火箭一樣飛向天際,哈哈。