Version: Unity 6.0 (6000.0)
语言 : 中文
刚体物理
配置刚体碰撞体

刚体物理简介

在现实物理世界中,刚体是在物理力作用下不会变形或改变形状的任何物理体。无论施加在刚体上的外力如何,刚体任意两个给定点之间的距离时刻保持恒定。

要模拟基于物理的行为,例如移动、重力、碰撞和关节,必须将场景中的项配置为刚体。要在 Unity 的 PhysX 系统中将游戏对象配置为刚体,可以为其分配 Rigidbody 组件。刚体组件在 API 中由 Rigidbody 类表示。

具有基于物理移动的刚体游戏对象

在 Unity 中,Rigidbody 组件提供了一种基于物理的方法来控制游戏对象的移动和位置。您可以使用模拟物理力和扭矩来移动游戏对象,并让物理引擎计算结果,而不是使用变换属性。

在大多数情况下,如果游戏对象具有刚体,则应使用刚体属性而不是变换属性来移动游戏对象。刚体属性施加来自物理系统的力和扭矩,从而更改游戏对象的变换;如果随后直接更改变换,Unity 将无法正确计算物理模拟,并可能出现不需要的行为。具有关节的刚体尤其如此。

Unity 在全局而不是本地处理基于物理的移动。当具有刚体的游戏对象通过基于物理的移动进行移动时,它将独立于任何父或子游戏对象。具有刚体的子游戏对象仍然使用其父游戏对象来定义其本地位置以进行初始化,但 Unity 会计算其在全局空间中基于物理的移动。

要通过脚本控制刚体,主要类是 AddForce(向游戏对象施加力)和 AddTorque(向游戏对象施加扭矩)。

没有基于物理的移动的刚体游戏对象

在某些情况下,可能希望物理系统检测游戏对象,而不是控制游戏对象。例如,您可能希望碰撞体检测游戏对象,但您打算通过其变换来控制该游戏对象的移动和位置。

Unity 中非基于物理的移动称为运动学运动。Rigidbody 组件具有 Is Kinematic 属性,启用此属性后,会将附加的游戏对象定义为非基于物理的游戏对象,并将其从物理引擎的控制中移除。这允许您通过变换组件进行运动学移动,而无需 Unity 的物理模拟计算来覆盖更改。

运动刚体可以向基于物理的刚体游戏对象施加基于物理的力,但不接收基于物理的力。例如,运动刚体可以与具有基于物理移动的刚体碰撞并“推动”刚体,但具有基于物理移动的刚体无法“推动”运动刚体。

如果使用关节将运动刚体附加到非运动刚体,则关节无法施加力来移动运动刚体。它只能移动非运动刚体。但是,您仍然可以通过变换组件移动运动刚体,关节可以调整非运动刚体的姿势以满足关节限制。

刚体优化

当刚体的移动速度低于睡眠阈值时(请参阅物理项目设置),Unity 会将刚体设置为“睡眠”,这意味着物理系统不会将其包含在物理计算中。当睡眠刚体接收到碰撞或力时,Unity 会“唤醒”刚体并继续将其包含在物理计算中。

在大多数情况下,刚体组件的睡眠和唤醒是自动发生的。但是,您也可以通过脚本、方法 Rigidbody.SleepRigidbody.WakeUp 自行控制此行为。

刚体可能无法唤醒以响应静态碰撞体(即没有刚体的碰撞体)的移动和碰撞,这些碰撞体通过变换位置而不是物理系统移动。如果物理系统无法再检测到静态碰撞体,这种情况尤其可能。如果发生这种情况,可以使用 Rigidbody.WakeUp 唤醒正在睡眠的刚体。

有关 PhysX 物理系统如何处理睡眠的更多信息,请参阅 NVIDIA PhysX SDK 刚体动力学文档的睡眠部分。

刚体物理
配置刚体碰撞体