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