刚体

概述

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 何时处于特定区域时非常有用,例如,在收集项目时,我们可能希望能够只运行它,但检测何时发生这种情况。