剛體
概述
Rigidbody 元件為 GameObject 提供了場景中的物理存在,因為它能夠響應力。你可以直接將力施加到 GameObject 或允許它對外部力量(例如重力或其他剛剛擊中它的物體)作出反應。
新增 Rigidbody 元件
你可以通過單擊 Component> Physics> Rigidbody 新增 Rigidbody
移動 Rigidbody 物件
建議如果你將一個 Rigidbody 應用於 GameObject,你使用力或扭矩來移動它而不是操作它的變換。使用 AddForce()
或 AddTorque()
方法:
// Add a force to the order of myForce in the forward direction of the Transform.
GetComponent<Rigidbody>().AddForce(transform.forward * myForce);
// Add torque about the Y axis to the order of myTurn.
GetComponent<Rigidbody>().AddTorque(transform.up * torque * myTurn);
塊
你可以改變 Rigidbody GameObject 的質量,以影響它對其他 Rigidbody 和力的反應。較高的質量意味著 GameObject 將對其他基於物理的 GameObjects 產生更大的影響,並且需要更大的力量來移動自身。如果具有相同阻力值,則質量不同的物體將以相同的速率下降。要改變程式碼中的質量:
GetComponent<Rigidbody>().mass = 1000;
拖動
阻力值越高,物體在移動時減速的越多。把它想象成一個反對的力量。要改變程式碼中的拖動:
GetComponent<Rigidbody>().drag = 10;
isKinematic
如果將 Rigidbody 標記為**運動學,**那麼它不會受到其他力的影響,但仍會影響其他遊戲物件。要改變程式碼:
GetComponent<Rigidbody>().isKinematic = true;
約束
還可以向每個軸新增約束以凍結 Rigidbody 在區域性空間中的位置或旋轉。預設為 RigidbodyConstraints.None
,如下所示:
程式碼中的約束示例:
// Freeze rotation on all axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeRotation
// Freeze position on all axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezePosition
// Freeze rotation and motion an all axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeAll
你可以使用按位 OR 運算子|
來組合多個約束,如下所示:
// Allow rotation on X and Y axes and motion on Y and Z axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezePositionZ |
RigidbodyConstraints.FreezeRotationX;
碰撞
如果你想要一個帶有 Rigidbody 的 GameObject 來響應碰撞,你還需要為它新增一個碰撞器。對撞機的型別有:
- 盒子對撞機
- 球體對撞機
- 膠囊對撞機
- 輪子對撞機
- 網格對撞機
如果對 GameObject 應用多個碰撞器,我們將其稱為複合碰撞器。
你可以將對撞機製作成觸發器,以便使用 OnTriggerEnter()
,OnTriggerStay()
和 OnTriggerExit()
方法。觸發器對撞機不會對碰撞做出物理反應,其他遊戲物件只是通過它。它們對於檢測另一個 GameObject 何時處於特定區域時非常有用,例如,在收集專案時,我們可能希望能夠只執行它,但檢測何時發生這種情況。