Version: 2019.2
Unity 5.0 中的插件
Unity 5.0 中的着色器

Unity 5.0 中的物理系统

Unity 5.0 已升级到 PhysX3.3 SDK。在对 4.x 项目采取任何操作之前,请快速查看此博文。此文档大致介绍了新代码库的功能:Unity 5 中的高性能物理。 请注意,PhysX3 与 PhysX2 不是 100% 兼容的,在升级时需要用户执行某些操作。

关于更新的概述

Unity 5.0 物理系统的预计工作速度是以前版本的 2 倍。以前熟悉的大多数组件仍然存在,它们的工作方式也和以前一样。当然,有些行为不可能相同,而有些则是由于预先存在的代码库的限制而引起的奇怪行为,所以不得不进行改变。变化最明显的两个方面是 Cloth 组件和 WheelCollider 组件。我们在下面会分别介绍这两个方面。另外,整体的物理代码也有一些较小的变化会导致不兼容。

可能影响项目的更改:

现在默认情况下关闭自适应作用力 (Adaptive Force)

引入自适应作用力是为了方便模拟大型堆栈,但事实证明它只适合用于演示。在真实游戏中,可能会导致错误的行为。可以在 Editor 物理属性中将其打开:Edit > Project settings > Physics > Enable adaptive force。

从地形和网格中均移除了平滑球体碰撞。

PhysX3 具有能够解决相同问题的功能,并且不再可切换,因为此功能被认为是没有重大缺陷的解决方案。

在使用 PhysX3 时弹簧表现出更大的幅度。

可能需要在升级后调整弹簧参数。

地形物理材质的设置已更改

请使用 TerrainCollider.sharedMaterial 和 TerrainCollider.material 指定地形的物理材质。通过 TerrainData 设置物理材质的旧方法将不再有效。好处是现在可以基于每个碰撞体指定地形物理材质。

形状投射和扫描已更改:

  • 形状扫描会报告命中的所有形状(即 CapsuleCast 和 SphereCast 将返回命中的所有形状,甚至是完全包含原始图元的形状)
  • 射线投射会过滤掉包含射线投射原点的形状

复合碰撞体事件:

使用复合碰撞体时,现在每个触点对都调用一次 OnCollisionEnter

触发器必须为凸面:

从现在开始,只能在凸面形状上使用触发器(PhysX 限制):

  • TerrainCollider 不再支持 IsTrigger 标志
  • MeshCollider 只有为凸面时才能有 IsTrigger

动态物体必须为凸面:

动态物体(即已连接刚体且 Kinematic = false 的物体)不再具有凹面网格物体碰撞体(PhysX 限制)。

如果要与凹面网格进行碰撞,则只能将它们放在静态碰撞体和运动物体上

布娃娃关节:

布娃娃的关节设置可能需要调整。

以下建议也适用于一般关节。

请参阅关节和布娃娃稳定性页面以查看此指南的最新版本。

  • 避免将“Angular Y Limit”和“Angular Z Limit”设置为较小的角度。根据具体设置,为了保持稳定,最小角度应在 5 到 15 度左右。尝试将角度设置为零,而不是使用小角度。这样会锁定轴并提供稳定的模拟。

  • 将“Enable Preprocessing”为 false(取消选中)。禁用预处理有助于防止关节“破裂”。如果关节被强制进入无法满足关节约束条件的情况,关节可能“破裂”。如果通过关节连接的刚体被静态碰撞几何体拉开(例如,在墙内不完整生成布娃娃),则会发生这种情况。

  • 布娃娃稳定性或拉伸:如果布娃娃处于极端情况下(例如在墙内不完整生成布娃娃或用大力推动布娃娃),关节解算器将无法使刚体保持在一起。这种情况下可能导致拉伸或“身体部位散乱”。请使用“ConfigurableJoint.projectionMode”或“CharacterJoint.enableProjection”在关节上启用投影。

  • 如果与关节连接的刚体抖动,请尝试增加 Edit > Project Settings > Physics >“Solver Iteration Count”值。尝试使用 10 到 20 之间的值。

  • 在运动刚体由关节连接到其他刚体情况下,切勿使用直接变换访问。这样做会跳过 PhysX 计算相应刚体的内部速度的步骤,导致解算器提供不良结果。我们看到过一些 2D 项目使用直接变换访问通过在骨架的根节点上更改 transform.direction 来翻转角色。如果改用 MovePosition/MoveRotation/Move,那么此行为会改善很多。

在局部空间中应用刚体的约束

我们在 Unity 4 中使用的锁定机制基本上放弃了对锁定旋转的更改,并将角速度重置为解算后步骤。这在大部分情况下都没有问题,不过有时由于解算器想要每帧都调整旋转而导致刚体无法进入睡眠状态,这时会有问题;多年来发现了一些相关的案例。在处理 PhysX3 集成时,我们利用了 PhysX 3.3 这一新功能,我们可以设置无限惯性张量分量来锁定旋转自由度。现在此功能在解算器中得到支持,因此刚体现在会正确进入睡眠状态,但由于这是惯性,因此会应用于局部坐标。

WheelCollider

新的 WheelCollider 由 PhysX3 车辆 SDK 提供支持,与我们的 PhysX2 代码相比,这基本上是一个全新的车辆模拟库。

请在此处阅读有关新 WheelCollider 的更多信息

布料 (Cloth)

Unity 5 使用新 PhysX SDK 提供的经过完全重写的布料解算器。此布料解算器在设计时考虑了角色服装,在性能和稳定性方面与旧版本相比有了很大的改进。Unity 5 将 Unity 4 中的 SkinnedCloth 和 InteractiveCloth 组件替换为单个 Cloth 组件,这个组件与 SkinnedMeshRenderer 结合使用。功能类似于以前的 SkinnedCloth 组件,但现在可以将任意非蒙皮网格分配给 SkinnedMeshRenderer,因此仍然可以在任何随机网格上处理布料模拟。

但是,新版本的 PhysX 现在不再支持旧 InteractiveCloth 组件上提供的某些功能,因为现在很难以高性能实现这些功能。具体而言:

  • 不能再使用布料与任意世界几何体碰撞
  • 不再支持测试
  • 不能再对布料施加压力
  • 不能再将布料附加到碰撞体,或者让布料对场景中的刚体施力。
Unity 5.0 中的插件
Unity 5.0 中的着色器