分類:Unity、C#、VS2015
創建日期:2016-05-02
一、簡介
Rigidbody(剛體)組件可使游戲對象在物理系統的控制下來運動,剛體可接受外力與扭矩力,使游戲對象像在真實世界中那樣進行運動。
任何游戲對象,只有對其添加了剛體組件,該對象才能受重力的影響。
通過腳本為游戲對象添加的作用力,以及通過NVIDlA物理引擎與其他的游戲對象發生互動的運算,都需要為游戲對象添加剛體組件。
二、如何為對象添加剛體
在Unity 5.x中為某個游戲對象添加剛體組件的辦法是:選中要添加剛體的游戲對象-->【Component】-->【Physics】-->【Rigidbody】,這樣就為該對象添加了剛體。
添加剛體和碰撞體后,選擇該對象,就會看到其周圍被一層綠色的框線包圍:
添加剛體和碰撞體的目的主要用於將該對象和其他對象之間進行碰撞檢測。碰撞體既可以用膠囊體來實現,也可以用其他碰撞體組件來實現。
三、相關屬性
與剛體相關的屬性如下。
1、Mass (質量)
對象的質量(任意單位)。不應使質量比其他剛體 (Rigidbody) 的質量大或小100 倍。
2、Drag (阻力)
在由於施加力而移動時空氣阻力對對象的影響程度。0 表示無空氣阻力,空氣阻力為無窮大將會使對象立即停止移動。
3、Angular Drag (角阻力)
對某個對象施加扭矩而導致該對象旋轉時,空氣阻力對該對象的影響程度。0 表示無空氣阻力。注意:不能僅僅通過將其“角阻力”(Angular Drag) 設置為無窮大使對象停止旋轉。
4、Use Gravity (是否使用重力)
如果啟用,則對象將受重力影響。
5、Is Kinematic (是否開啟運動學)
如果啟用,則該對象不會由物理引擎驅動,而是只能通過對其施加變換 (Transform)進行處理。對於手機等移動平台,或者對附加了鉸鏈關節 (HingeJoint) 的剛體 (Rigidbody) 進行動畫處理時,為對象開啟運動學十分有用。
6、Interpolate (插值處理)
該項用於控制剛體運動的抖動情況。僅當在剛體 (Rigidbody) 移動中發現不平穩時,才嘗試下面這些選項之一:
None:不應用插值。
Interpolate:內插。變換(Transform) 基於上一幀的變換 (Transform) 進行平滑處理。
Extrapolate:外插。變換 (Transform) 基於下一幀的估計變換 (Transform) 進行平滑處理。
7、Collision Detection (碰撞檢測)
該屬性用於控制避免高速運動的游戲對象穿過其他的對象而未發生碰撞。選項有:
(1)Discrete(離散)
對場景中的所有其他碰撞體 (Collider) 全部使用離散 (Discreet) 碰撞檢測。該項為默認值。
(2)Continuous (連續)
對剛體 (Rigidbody) 進行碰撞測試時,對帶有剛體的動態碰撞體 (Collider) 使用離散 (Discreet) 碰撞檢測;對不帶剛體的靜態網格碰撞體 (static Mesh Collider)使用連續 (Continuous) 碰撞檢測。
(3)Continuous Dynamic (連續動態)
該選項可用於快速移動的對象。
對設置為“連續”(Continuous) 和“連續動態”(Continuous Dynamic) 碰撞的對象使用連續 (Continuous) 碰撞檢測。它對不帶剛體的靜態網格碰撞體也使用連續 (Continuous) 碰撞檢測。對於所有其他碰撞體 (Collider),使用離散 (Discreet) 碰撞檢測。
注意:連續動態(Continuous Dynamic) 檢測需要與之碰撞的對象對物理性能的影響非常大,如果對快速對象的碰撞沒有問題,應該將其設置為“離散”(Discreet)而不是連續動態。
8、Constraints (約束)
對剛體 (Rigidbody) 運動的限制。
(1)Freeze Position (凍結位置)
選擇性地在世界坐標 X、Y 和 Z 軸上停止剛體 (Rigidbody) 移動。即:剛體對象在世界坐標系中的X、Y、4由方向上(勾選狀態)的移動將無效。
(2)Freeze Rotation (凍結旋轉)
選擇性地停止剛體 (Rigidbody) 圍繞世界坐標 X、Y 和 Z 軸的旋轉。即:剛體對象在世界坐標系中的X、Y、4由方向上(勾選狀態)的旋轉將無效。
三、注意事項
1、Rigidbody和Transform只能二選一
剛體(Rigidbody)會使游戲對象在物理引擎的控制下運動,例如可以以真實的碰撞形式來開門或計算其他的行為。通過在剛體上添加作用力來操作游戲對象,這與直接調整Transform組件相比在視覺及感受上都有很大的不同。通常情況下,沒有必要在操作—個對象剛體的同時也操作其Transform,只需要二選其一即可。
操作游戲對象的Rigidbody與操作該對象的Transform最大的不同就是剛體有作用力,而且剛體可以接受外力和扭矩,但是Transform無法達到該效果。Transform可以移動和旋轉游戲對象,這與使用物理的方式並不相同。
對—個剛體添加外力或扭矩實際上也會改變該對象Transform組件的移動和旋轉,這也就是這兩者只需要選其一的原因。使用物理方式操作對象的同時又改變它的Transform會導致碰撞及其他相關的計算出現問題。
剛體在受物理引擎作用之前必須要明確地將其添加給一個游戲對象,之后該對象就會受到重力和通過腳本添加的作用力的影響,但根據實際情況可能還需要為其添加碰撞體或關節等以便達到預期的行為效果。
2、父子化 (Parenting)
當對象處於物理控制之下時,其移動方式與其變換父級的移動方式半獨立。如果移動任何父級,則會隨它們一起拉動剛體 (Rigidbody) 的子級。但是,剛體 (Rigidbody) 仍會由於重力的作用而下落並對碰撞事件作出反應。
3、腳本處理
要控制剛體 (Rigidbody),主要使用腳本添加力或扭矩。可通過對對象的剛體 (Rigidbody) 調用 AddForce() 和 AddTorque() 來實現此目的。
記住:不應在使用物理時直接改變對象的變換 (Transform)。
4、動畫
有些情況下,如需要創建布娃娃效果的時候,需要在動畫和物理系統間切換對象的控制權。因此當剛體被標記為動力學(isKinematic)模式時,就不會受到如碰撞、作用力或其他物理效果的影響,這就意味着需要直接操作該對象的Transform組件屬性來控制該對象了。動力學剛體(Kinematic Rigidbody)會影響其他的對象,但其自身並不受到物理系統的影響。例如,那些綁定到動力學(Kinematic)對象上的關節(Joint)會約束其他綁定到該對象上的剛體(Rigidbody),動力學剛體(Kinematic Rigidbody)在碰撞時會影晌其他的剛體。