天天看點

【Unity】11.2 剛體(Rigidbody)

分類:Unity、C#、VS2015

建立日期:2016-05-02

一、簡介

Rigidbody(剛體)元件可使遊戲對象在實體系統的控制下來運動,剛體可接受外力與扭矩力,使遊戲對象像在真實世界中那樣進行運動。

任何遊戲對象,隻有對其添加了剛體元件,該對象才能受重力的影響。

通過腳本為遊戲對象添加的作用力,以及通過NVIDlA實體引擎與其他的遊戲對象發生互動的運算,都需要為遊戲對象添加剛體元件。

二、如何為對象添加剛體

在Unity 5.x中為某個遊戲對象添加剛體元件的辦法是:選中要添加剛體的遊戲對象-->【Component】-->【Physics】-->【Rigidbody】,這樣就為該對象添加了剛體。

添加剛體和碰撞體後,選擇該對象,就會看到其周圍被一層綠色的框線包圍:

【Unity】11.2 剛體(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)在碰撞時會影晌其他的剛體。