搜索 Unity

Setup for some moving platforms: Hero image
Setup for some moving platforms: Hero image
分享

Is this article helpful for you?

Thank you for your feedback!

自ECS for Unity预发布以来,1.0.0-pre.22版起的Unity Physics就开始支持马达(motor)。马达是一种特殊关节,关节的一端会向目标方位施加驱动力。这个目标既可以是位置,即马达会一直尝试抵达该位置,也可以是向量,即马达会尽量保持一定的向量。目前,Unity Physics支持四种马达(两种位置马达和两种向量马达):

  1. 驱动铰链结构向特定角度运动的旋转马达
  2. 驱动铰链结构按一定角速度绕轴心旋转的角速度马达
  3. 驱动对象向目标位置移动的位移马达
  4. 驱动对象以一定矢量移动的线速度马达

每种马达都受Unity PhysicsHavok Physics for Unity支持。

马达类型介绍

在介绍各个马达之前,我们可以先去GitHub上的PhysicsSamples项目里找到演示,并在Unity说明文档里找到详细说明。文档描述了几种建立上述马达的方式,包括用GameObject、C#脚本或Unity Physics Custom Authoring Component。

旋转马达

旋转马达是一种向特定角度运动的铰链关节,其类似于一个弹簧铰链。

在开发时,我们想到的是可以自动关闭的弹簧门。也可以是(比如对抗重力)固定在某个角度的关节。

要想创建一扇自动关闭的门,我们可以为Door对象添加带有以下参数的Hinge Joint,将Connected Body连接到带静态刚体(Rigidbody)的Wall上。注意,要想让马达执行位置的运动,我们必须启用Use Spring并禁用Use Motor(这会让马达产生矢量运动)。

Figure: Inspector settings of a Hinge Joint that is configured as a swinging door with a Target Position of 0 degrees and a Break Torque of 900.
图示:弹簧门的Hinge Joint配置,Target Position被设为0度,Break Torque被设为900.

角速度马达

假设我们想把弹簧门变成旋转门,那就需要将运动目标设为一个矢量而非位置。我们可以拿一个圆柱体当作父对象,再加上马达和几个代表门的长方体。

我们来看看把Hinge Joint变成角速度马达的设定:

Figure: Inspector settings of a Hinge Joint that is configured as a revolving door with a Target Motor Velocity of 90 degrees/s and a Motor Force of 1000, which is the maximum force the motor can exert.
图示:旋转门的Hinge Joint设定,Target Motor Velocity设为了90度,Motor Force为1000,这是马达可施加的最大力。

如上方视频所示,我们可以手动加快或减慢马达的速度,影响马达的模拟。视频里的Motor Force是1000。如果这个力被设为无限大,则无法对马达施加影响。

运动马达

运动马达是一种驱动对象向特定位置移动的单轴关节,其行为与弹簧关节非常类似。我们可以用它来实现类似弹簧伸展到特定长度的运动。另一种用法是浮动平台或滑动门。假设我们希望做几个浮动平台。

Figure: Setup for some moving platforms
图示:浮动平台配置

要建立运动马达,请设好Configurable JointTarget PositionX Drive: Position SpringX Drive: Maximum Force字段。下方设定好的Configurable Joint可以让场景内的平台从左侧移动到右侧:

Figure: Configurable Joint settings to make a position motor that moves from left to right.
图示:从左往右运动的Configurable Joint设定

在视频里,无论Position Spring字段的设定如何,平台在到达目标位置后都会被弹开。这是因为马达使用着默认的Unity Physics弹力与阻尼参数。

目前,要规避这种现象,我们可以用脚本来创建马达,直接设置SpringFrequencySpringDamping的数值。实际上,用脚本创建马达更为合适,因为我们能更灵活地根据项目代码做出调整,调整弹力和阻尼参数,或者定时改变运动方向。调整弹力和阻尼参数,或者定时改变运动方向。

线速度马达

线速度马达一般可用在火箭推进器上,也能用来驱动火车、平台或其他任意事物。

本示例中,我们用简单形状做了两艘火箭,为箭身添加了一个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被设为无限,则火箭不会受外力影响改变航向,但另一艘火箭会。

Figure: Settings of a Configurable Joint used to create a linear velocity motor.
图示:产生线性运动的Configurable Joint设定。

未来计划

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

是否希望关节支持某种特定用法?是否有感到困惑?或者有建设性建议?那就来Unity Physics论坛加入讨论,帮我们进一步改善Unity Physics吧。

2023年4月11日 类别 Engine & platform | 10 分 阅读

Is this article helpful for you?

Thank you for your feedback!

相关文章