Unity 5.0 已升级到 PhysX3.3 SDK。在对 4.x 项目采取任何操作之前,请快速查看此博文。此文档大致介绍了新代码库的功能:Unity 5 中的高性能物理。 请注意,PhysX3 与 PhysX2 不是 100% 兼容的,在升级时需要用户执行某些操作。
Unity 5.0 物理系统的预计工作速度是以前版本的 2 倍。以前熟悉的大多数组件仍然存在,它们的工作方式也和以前一样。当然,有些行为不可能相同,而有些则是由于预先存在的代码库的限制而引起的奇怪行为,所以不得不进行改变。变化最明显的两个方面是 Cloth 组件和 WheelCollider 组件。我们在下面会分别介绍这两个方面。另外,整体的物理代码也有一些较小的变化会导致不兼容。
引入自适应作用力是为了方便模拟大型堆栈,但事实证明它只适合用于演示。在真实游戏中,可能会导致错误的行为。可以在 Editor 物理属性中将其打开:Edit > Project settings > Physics > Enable adaptive force。
PhysX3 具有能够解决相同问题的功能,并且不再可切换,因为此功能被认为是没有重大缺陷的解决方案。
可能需要在升级后调整弹簧参数。
请使用 TerrainCollider.sharedMaterial 和 TerrainCollider.material 指定地形的物理材质。通过 TerrainData 设置物理材质的旧方法将不再有效。好处是现在可以基于每个碰撞体指定地形物理材质。
使用复合碰撞体时,现在每个触点对都调用一次 OnCollisionEnter
从现在开始,只能在凸面形状上使用触发器(PhysX 限制):
动态物体(即已连接刚体且 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 由 PhysX3 车辆 SDK 提供支持,与我们的 PhysX2 代码相比,这基本上是一个全新的车辆模拟库。
请在此处阅读有关新 WheelCollider 的更多信息。
Unity 5 使用新 PhysX SDK 提供的经过完全重写的布料解算器。此布料解算器在设计时考虑了角色服装,在性能和稳定性方面与旧版本相比有了很大的改进。Unity 5 将 Unity 4 中的 SkinnedCloth 和 InteractiveCloth 组件替换为单个 Cloth 组件,这个组件与 SkinnedMeshRenderer 结合使用。功能类似于以前的 SkinnedCloth 组件,但现在可以将任意非蒙皮网格分配给 SkinnedMeshRenderer,因此仍然可以在任何随机网格上处理布料模拟。
但是,新版本的 PhysX 现在不再支持旧 InteractiveCloth 组件上提供的某些功能,因为现在很难以高性能实现这些功能。具体而言:
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.