在现实世界物理学中,刚体是任何在物理力作用下不会变形或改变形状的物理物体。刚体中任意两点的距离始终保持不变,无论其上施加了何种外力。
要模拟基于物理的行为,例如运动、重力、碰撞当物理引擎检测到两个游戏对象的碰撞器发生接触或重叠时,就会发生碰撞,前提是至少其中一个具有 Rigidbody 组件并且处于运动状态。 更多信息
参见 词汇表 和关节,你需要在你的 场景场景包含游戏环境和菜单。可以将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,你放置环境、障碍物和装饰,本质上是设计和构建你的游戏。 更多信息
参见 词汇表 中将物体配置为刚体。要在 Unity 的 PhysX 系统中将 游戏对象Unity 场景中的基本对象,可以代表角色、道具、场景、摄像机、路点等等。游戏对象的特性由附加到它的组件定义。 更多信息
参见 词汇表 配置为刚体,可以为它们分配 Rigidbody一个组件,允许游戏对象受到模拟重力和其它力的影响。 更多信息
参见 词汇表 组件。Rigidbody 组件在 API 中由 Rigidbody
类表示。
在 Unity 中,Rigidbody 组件提供了一种基于物理的方式来控制游戏对象的运动和位置。你可以使用模拟物理力矩来移动游戏对象,而不是使用 Transform 属性,并让 物理引擎一个模拟物理系统各个方面的系统,以便对象能够正确加速并受到碰撞、重力和其它力的影响。 更多信息
参见 词汇表 计算结果。
在大多数情况下,如果一个游戏对象具有 Rigidbody,你应该使用 Rigidbody 属性来移动游戏对象,而不是使用 Transform 属性。Rigidbody 属性会从物理系统应用力矩,从而改变游戏对象的 Transform;如果你随后直接更改 Transform,Unity 无法正确计算物理模拟,并且你可能会看到不希望的行为。这对于具有 关节一个物理组件,允许在 Rigidbody 组件之间进行动态连接,通常允许一定程度的运动,例如铰链。 更多信息
参见 词汇表 的刚体尤其如此。
Unity 全局处理基于物理的运动,而不是局部处理。当具有 Rigidbody 的游戏对象通过基于物理的运动移动时,它会独立于任何父级或子级游戏对象移动。具有 Rigidbody 的子级游戏对象仍然使用其父级游戏对象来定义其初始的局部位置,但 Unity 在全局空间中计算其基于物理的运动。
要通过脚本控制 Rigidbody,主要类是 AddForce
(向游戏对象添加力)和 AddTorque
(向游戏对象应用力矩)。
在某些情况下,你可能希望物理系统检测一个游戏对象,但不希望它控制该对象。例如,你可能希望 碰撞器一个无形的形状,用于处理对象的物理碰撞。碰撞器不必与对象的网格完全相同形状 - 一个粗略的近似通常更有效,在游戏过程中也无法区分。 更多信息
参见 词汇表 检测一个游戏对象,但你打算通过其 Transform 控制该游戏对象的运动和位置。
Unity 中非基于物理的运动称为 运动学运动。Rigidbody 组件具有属性 Is Kinematic,启用该属性后,将附加的游戏对象定义为非基于物理的,并将其从物理引擎的控制中移除。这允许你通过 Transform 以运动学方式移动它,而不会让 Unity 的物理模拟计算覆盖这些更改。
运动学 Rigidbody 可以对基于物理的 Rigidbody 游戏对象应用基于物理的力,但不会受到基于物理的力的影响。例如,运动学 Rigidbody 可以与具有基于物理的运动的 Rigidbody 发生碰撞并“推动”它,但具有基于物理的运动的 Rigidbody 无法“推动”运动学 Rigidbody。
如果你使用 关节 将运动学 Rigidbody 附加到非运动学 Rigidbody,该关节无法施加力来移动运动学 Rigidbody。它只能移动非运动学 Rigidbody。但是,你仍然可以通过 Transform 移动运动学 Rigidbody,而该关节可以调整非运动学物体的姿态以满足关节限制。
当 Rigidbody 的速度低于 休眠阈值 时(参见 Physics 项目设置),Unity 将 Rigidbody 设置为“休眠”,这意味着物理系统不将它包含在物理计算中。当休眠的 Rigidbody 受到碰撞或力时,Unity 会“唤醒”该 Rigidbody,并继续将其包含在物理计算中。
默认情况下,Rigidbody 组件的休眠和唤醒会自动发生。但是,你也可以通过脚本通过方法 Rigidbody.Sleep
和 Rigidbody.WakeUp
自己控制这种行为。
Rigidbody 可能会无法响应来自静态碰撞器的运动和碰撞而唤醒(即没有 Rigidbody 的碰撞器),这些碰撞器通过 Transform 位置而不是物理系统移动。如果物理系统不再能检测到静态碰撞器,这种情况尤其有可能发生。如果发生这种情况,你可以使用 Rigidbody.WakeUp
唤醒休眠的 Rigidbody。
有关 PhysX 物理系统如何处理休眠的更多信息,请参见 NVIDIA PhysX SDK 刚体动力学文档中的 休眠 部分。