Version: 2017.4
网格碰撞体 (Mesh Collider)
球形碰撞体

刚体

刚体 (Rigidbody)使__游戏对象__的行为方式受物理控制。刚体可以接受力和扭矩,使对象以逼真的方式移动。任何游戏对象都必须包含受重力影响的刚体,行为方式基于施加的作用力(通过脚本),或通过 NVIDIA PhysX 物理引擎与其他对象交互。

属性

属性: 功能:
Mass 对象的质量(默认为千克)。
Drag 根据力移动对象时影响对象的空气阻力大小。0 表示没有空气阻力,无穷大使对象立即停止移动。
Angular Drag 根据扭矩旋转对象时影响对象的空气阻力大小。0 表示没有空气阻力。请注意,如果直接将对象的 Angular Drag 属性设置为无穷大,无法使对象停止旋转。
Use Gravity 如果启用此属性,则对象将受重力影响。
Is Kinematic 如果启用此选项,则对象将不会被物理引擎驱动,只能通过__变换 (Transform)__ 对其进行操作。对于移动平台,或者如果要动画化附加了 HingeJoint 的刚体,此属性将非常有用。
Interpolate 仅当在刚体运动中看到急动时才尝试使用提供的选项之一。
- None 不应用插值。
- Interpolate 根据前一帧的变换来平滑变换。
- Extrapolate 根据下一帧的估计变换来平滑变换。
Collision Detection 用于防止快速移动的对象穿过其他对象而不检测碰撞。
- Discrete 对场景中的所有其他碰撞体使用离散碰撞检测。其他碰撞体在测试碰撞时会使用离散碰撞检测。用于正常碰撞(这是默认值)。
- Continuous 对动态碰撞体(具有刚体)使用离散碰撞检测,并对静态网格碰撞体(没有刚体)使用连续碰撞检测。设置为连续动态 (Continuous Dynamic) 的刚体将在测试与该刚体的碰撞时使用连续碰撞检测。其他刚体将使用离散碰撞检测。用于连续动态检测需要碰撞的对象。(此属性对物理性能有很大影响,如果没有快速对象的碰撞问题,请将其保留为 Discrete 设置)
- Continuous Dynamic 对设置为连续 (Continuous) 和连续动态碰撞 (Continuous Dynamic Collision) 的对象使用连续碰撞检测。还将对静态网格碰撞体(没有刚体)使用连续碰撞检测。对于所有其他碰撞体,使用离散碰撞检测。用于快速移动的对象。
Constraints 对刚体运动的限制:
- Freeze Position 有选择地停止刚体沿世界 X、Y 和 Z 轴的移动。
- Freeze Rotation 有选择地停止刚体围绕局部 X、Y 和 Z 轴旋转。

详细信息

刚体可使游戏对象的行为方式受物理引擎控制。由此可以实现逼真碰撞和不同类型关节等行为。通过向刚体施力来操纵游戏对象产生的效果完全不同于直接调整变换__组件__。通常,不应同时操纵同一个游戏对象的刚体和变换 - 一次只能操纵其中一个。

操纵变换与刚体的最大区别在于力的运用。刚体可以接受力和扭矩,但变换不能。变换可以被平移和旋转,但这与使用物理引擎不同。亲自尝试使用二者会注意到明显的差异。向刚体施加力/扭矩实际上会改变对象的变换组件位置和旋转。这就是为何应该只使用其中一个组件的原因。使用物理引擎时更改变换可能会导致碰撞和其他计算问题。

必须先将刚体显式添加到游戏对象中,然后才能让刚体受到物理引擎的影响。可以从菜单中的 Components > Physics > Rigidbody 向所选对象添加刚体。现在对象已经完成物理设置;它会受到重力的影响而掉落,而且可以通过脚本来接受作用力,但可能需要添加一个__碰撞体__或关节来让对象按照期望的方式运行。

父子化

当对象处于物理控制下时,对象的移动方式在一定程度上独立于其变换父对象的移动方式。如果移动任何父对象,它们会将刚体子对象拉到自己身边。但是,刚体仍然会因重力而降落,并会对碰撞事件作出反应。

脚本

要控制刚体,主要需要使用脚本来施加力或扭矩。要执行此操作,可在对象的刚体上调用 AddForce()AddTorque()。请记住,在使用物理引擎时,不应直接改变对象的变换。

动画

在某些情况下,主要需要创建布娃娃效果,因此有必要在动画和物理之间切换对象的控制。为此,可将刚体标记为 isKinematic。虽然刚体标记为 __isKinematic__,但不会受到碰撞、力或物理系统任何其他部分的影响。这意味着,必须通过直接操作变换组件来控制对象。运动刚体将影响其他对象,但它们自身不会受到物理影响。例如,附加到运动对象的关节将约束附加到关节的所有其他刚体,并且运动刚体将通过碰撞影响其他刚体。

碰撞体

碰撞体是另一种必须与刚体一起添加才会实现碰撞的组件。如果两个刚体相互碰撞,只有两个对象都附加了碰撞体时,物理引擎才会计算碰撞。在物理模拟过程中,无碰撞体的刚体将直接相互穿过对方。

碰撞体定义刚体的物理边界
碰撞体定义刚体的物理边界

可通过 Component > Physics 菜单添加碰撞体。请查看单个碰撞体的组件参考页面以获取更多具体信息:

复合碰撞体

复合碰撞体是原始碰撞体的组合,共同作为单个碰撞体。如果模型在性能方面过于复杂或成本过高而无法精确模拟,因此希望使用简单的近似值以最佳方式模拟形状的碰撞,复合碰撞体将派上用场。要创建复合碰撞体,请创建碰撞对象的子对象,然后将碰撞体组件添加到每个子对象。这样就能轻松独立定位、旋转和缩放每个碰撞体。可以通过许多原始碰撞体和/或凸面网格碰撞体构建复合碰撞体。

真实复合碰撞体设置
真实复合碰撞体设置

在上图中,游戏对象 Gun Model 附加了一个刚体,使用多个原始碰撞体作为子游戏对象。当刚体父对象由于受力而移动时,子碰撞体会随之移动。原始碰撞体将与环境的网格碰撞体碰撞,而父刚体将根据所受的力以及其子碰撞体与场景中其他碰撞体的交互方式来改变自己的移动方式。

网格碰撞体通常不能相互碰撞。如果网格碰撞体被标记为__凸面体 (Convex)__,则可与另一个网格碰撞体发生碰撞。典型的解决方案是对所有移动的对象使用原始碰撞体,而对静态背景对象使用网格碰撞体。

连续碰撞检测

连续碰撞检测是一种阻止快速移动的碰撞体相互穿过的功能。使用正常 (Discrete) 碰撞检测时,如果对象在一个帧中位于某个碰撞体的一侧,而在下一帧中已经穿过了碰撞体,便属于彼此穿过的情况。要解决此问题,可在快速移动对象的刚体上启用连续碰撞检测。将碰撞检测模式设置为 Continuous 可防止刚体穿过任何静态(即非刚体)网格碰撞体。设置为 Continuous Dynamic 也会防止刚体穿过任何其他支持的刚体(即,碰撞检测模式设置为 ContinuousContinuous Dynamic 的刚体)。 盒型碰撞体、球形碰撞体和胶囊碰撞体支持连续碰撞检测。请注意,连续碰撞检测的目的是作为一种安全机制,可在对象会相互穿过的情况下捕获碰撞,但不会提供精确物理碰撞的结果;所以如果遇到快速移动对象的问题,仍然可以考虑在 TimeManager 检视面板中降低固定时间步长值以使模拟更准确。

使用合适的大小

游戏对象网格的大小比刚体的质量重要得多。如果发现刚体的行为与预期不符,比如:移动缓慢、漂浮或碰撞方式不正确,请考虑调整网格资源的缩放比例。Unity 的默认单位比例为 1 个单位等于 1 米,因此会维持导入网格的比例并应用于物理计算。例如,摇摇欲坠的摩天大楼在坍塌时与由玩具积木制成的塔楼完全不同,因此不同大小的对象应按照精确比例建模。

如果要对人类进行建模,请确保该模型在 Unity 中的高度约为 2 米。要检查对象是否具有适当的大小,请将其与默认立方体进行比较。可以使用 GameObject > 3D Object > Cube 来创建立方体。立方体的高度恰好是 1 米,所以人的高度应该是其两倍。

如果无法调整网格本身,可以更改特定网格资源的统一比例,操作方法是在 Project 视图__中选择该网格资源,然后从菜单中选择 Assets > Import Settings…__。在此处,可以更改比例并重新导入网格。

如果游戏需要在不同比例下实例化游戏对象,则可以调整变换的缩放轴的值。缺点是物理模拟必须在对象实例化时执行更多工作,并且可能导致游戏时性能下降。这倒不是可怕的损失,但此方法不如使用其他两个选项来最终确定比例那么高效。另外请注意,使用父子化 (Parenting) 时,不统一的比例会产生意外行为。出于这些原因,最好在建模应用程序中以正确的比例创建对象。

提示

  • 两个刚体的相对__质量__决定了它们相互碰撞时的反应情况。
  • 使一个刚体具有比另一个刚体更大的__质量__并不会使其在自由落体时降落得更快。要实现这一目的,请使用 Drag
  • 较低的 Drag 值会让对象看起来较重。较高的值会使其看起来较轻。Drag 的典型值为 .001(实心金属块)到 10(羽毛)之间。
  • 如果要直接操作对象的变换组件,但仍希望获得物理效果,请附加刚体并将其设为 Kinematic。
  • 如果要通过变换组件移动游戏对象,但希望接收 Collision/Trigger 消息,必须将刚体附加到正在移动的对象。
  • 如果直接将对象的 Angular Drag 属性设置为无穷大,无法使对象停止旋转。
网格碰撞体 (Mesh Collider)
球形碰撞体