自 ECS for Unity 预发布以来,1.0.0-pre.22 版起的 Unity Physics 就开始支持马达(motor)。马达是一种特殊关节,关节的一端会向目标方位施加驱动力。这个目标既可以是位置,即马达会一直尝试抵达该位置,也可以是向量,即马达会尽量保持一定的向量。目前,Unity Physics 支持四种马达(两种位置马达和两种向量马达):
-
驱动铰链结构向特定角度运动的 旋转马达
-
驱动铰链结构按一定角速度绕轴心旋转的 角速度马达
-
驱动对象向目标位置移动的 运动马达
-
驱动对象以一定矢量移动的 线速度马达
每种马达都受
Unity Physics
和
Havok Physics for Unity
支持。
马达类型
在介绍各个马达之前,我们可以先去 GitHub 上的
PhysicsSamples
项目里找到演示,并在
Unity 说明文档
里找到详细说明。文档描述了几种建立上述马达的方式,包括用 GameObject、C# 脚本或 Unity Physics Custom Authoring Component。
旋转马达
旋转马达是一种向特定角度运动的铰链关节,类似于一个弹簧铰链。
在开发时,我们联想到的是可以自动关闭的弹簧门。也可以是(比如对抗重力)固定在某个角度的关节。
要想创建一扇自动关闭的门,我们可以为
Door 对象
添加带有以下参数的
Hinge Joint
,将
Connected Body
连接到带静态刚体(Rigidbody)的
Wall
上。注意,要想让马达执行位置的运动,我们必须启用
Use Spring
并禁用
Use Motor
(这会让马达产生矢量运动)。

图示:弹簧门的 Hinge Joint 配置,Target Position 被设为 0 度,Break Torque 被设为 900。
角速度马达
假设我们想把弹簧门变成旋转门,那就需要将运动目标设为一个矢量而非位置。我们可以拿一个圆柱体当作父对象,再加上马达和几个代表门的长方体。
我们来看看把 Hinge Joint 变成角速度马达的设定:

图示:旋转门的 Hinge Joint 设定,Target Motor Velocity 设为了 90 度,Motor Force 为 1000,这是马达可施加的最大力。
如上方视频所示,我们可以手动加快或减慢马达的速度,影响马达的模拟。视频里的
Motor Force
是 1000。如果这个力被设为无限大,则无法对马达施加影响。
运动马达
运动马达是一种驱动对象向特定位置移动的单轴关节,其行为与弹簧关节非常类似。我们可以用它来实现类似弹簧伸展到特定长度的运动。另一种用法是浮动平台或滑动门。假设我们希望做几个浮动平台:

图示:浮动平台配置
要建立运动马达,请设好
Configurable Joint
的
Target Position
、
X Drive: Position Spring
和
X Drive: Maximum Force
字段。下方设定好的 Configurable Joint 可以让场景内的平台从左侧移动到右侧:

图示:从左往右运动的 Configurable Joint 设定
在视频里,无论 Position Spring 字段的设定如何,平台在到达目标位置后都会被弹开。这是因为马达使用着默认的 Unity Physics 弹力与阻尼参数。
目前,要规避这种现象,我们可以用脚本来创建马达,直接设置
SpringFrequency
和
SpringDamping
的数值。实际上,用脚本创建马达更为合适,因为我们能更灵活地根据项目代码做出调整,调整弹力和阻尼参数,或者定时改变运动方向。
线速度马达
线速度马达一般可用在火箭推进器上,也能用来驱动火车、平台或其他任意事物。
本示例中,我们用简单形状做了两艘火箭,为箭身添加了一个 Configurable Joint。向右飞行的火箭重量为 10 千克,目标速度为 3 米/秒,向左飞行的火箭重量为 20 千克,目标速度为 4 米/秒。
下方为右向飞行火箭的参数(未包括所有 Configurable Joint 选项,未展示的选项仍为默认,未经修改)。需要注意的是设为 -3、0、0 米/秒的
Target Velocity
。目标速度的正负会相对于对象未来的位置而定,负数会推动火箭前进。
在 X Drive 部分,
Position Damper
被随意设为了 10,Maximum Force 为 2000。另一艘火箭的 Maximum Force 则为 1000。这个差别影响着改变马达运动轨迹所需的力,如果右向火箭的 Maximum Force 被设为无限,则火箭不会受外力影响改变航向,但另一艘火箭会。

图示:产生线性运动的 Configurable Joint 设定。
未来计划
Unity Physics 提供的基础性关节功能可以有非常多的用法。未来,我们会继续简化工作流,打磨内置 Physics 组件的功能。比如让组件的弹力和阻尼参数支持马达,支持烘焙 Configurable Joint 编辑组件。这些改进可让关节更为耐用,包括那些绕多条轴运动的关节(比如 active ragdolls)。