加速物理模拟的实用技巧
1. 物理对象的位置与质量
为避免引入浮点精度误差,除非项目已深入后期(此时更改和重新测试所有内容会很麻烦),应尽量让物理对象靠近坐标原点 (0,0,0)。这样做不仅能避免精度问题,还能加快在游戏世界中添加和定位对象的速度。
在质量方面,Unity 文档建议对象的质量值保持在 0.1 左右,且不超过 10,因为过大的质量值会导致物理模拟不稳定。这里的质量并非指实际的磅或千克等度量单位,而是对象之间的相对值。在碰撞对象之间,应保持一致且合理的质量比。当质量比大于 1000 时,由于动量差异大且可能导致浮点精度丢失,对象的行为会变得不稳定。因此,应尽量让质量属性值相近的对象发生碰撞,对于质量差异较大的对象对,可以使用碰撞矩阵进行筛选。
此外,地球中心的重力对所有物体的影响是相同的,与物体质量无关。所以,无需为这些相对质量属性值调整重力。但物体下落时所受的空气阻力会影响其下落速度,例如羽毛比相同质量的实心物体下落得慢。为了实现更真实的行为,可以自定义物体的阻力属性,或者为每个物体自定义重力(如禁用“使用重力”复选框,并通过脚本代码应用自定义重力)。
2. 合理使用静态碰撞器
物理系统会分别为静态碰撞器(无刚体对象的碰撞器)和动态碰撞器(有刚体对象的碰撞器)生成数据结构。如果在运行时向静态碰撞器的数据结构中引入新对象,该结构必须重新生成,这可能会导致 CPU 使用率大幅上升。因此,在游戏运行期间应避免实例化新的静态碰撞器。
此外,移动、旋转或缩放静态碰撞器也会触发数据结构的重新生成,应尽量避免。如果需要移动碰撞器且不希望其对其他物体的碰撞产生物理反应,可以为其添加刚体组件,将其转换为动态碰撞器,并将“