剛體

概述

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,如下所示:

StackOverflow 文件

程式碼中的約束示例:

// 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 何時處於特定區域時非常有用,例如,在收集專案時,我們可能希望能夠只執行它,但檢測何時發生這種情況。