移动物体是在三维空间中沿一个或多个轴移动的物体。利用Roblox的模拟引擎的内置功能,您可以使物体移动并与其环境互动,以模拟玩家熟悉的现实世界物理行为,例如重力、空气动力学和摩擦。
使用移动物体 .rbxl 文件作为参考,本教程解释了物理力如何影响Studio中的线性运动,并向您展示了在游戏中以不同的运动行为将物体从点A移动到点B的各种技术,包括以下指导:
- 使用 LinearVelocity 移动约束以恒定线性速度移动整个组件。
- 使用 PrismaticConstraint 将组件限制在单个轴上,并相对于三维空间中的某一点以恒定线性速度移动。
- 使用 ApplyImpulse 方法以初始冲力移动组件,使组件随时间逐渐减速。
线性运动和物理力
Roblox Studio是一个实时模拟引擎,模拟现实世界的物理行为,因此为了预测在游戏中线性移动的物体如何表现,了解物体在现实生活中如何进行线性运动是非常重要的。
线性运动是沿一个轴的运动。例如,当一个方块具有线性运动时,它沿着一个设定的轴移动。

线性运动不能在没有外部物理力推动或拉动物体的情况下存在。根据牛顿的第一运动定律,静止的物体保持静止,运动的物体在没有外部力作用的情况下保持以恒定速度运动。例如,静止的方块保持静止,除非有像风这样的物理力推动它移动。
力是物理推或拉的方向和大小的度量,导致物体沿一个轴改变其线性速度。速度的变化称为加速度。这个概念对于在Studio中移动物体特别重要;您施加的力越大,物体加速的速度就越快。
这是因为施加的力需要大于任何抵抗物体的物理力,例如重力或摩擦。例如,如果您将方块放在金属板上,风的物理力需要克服金属板的摩擦力才能继续加速方块。如果风的力并没有比金属板的摩擦力大得多,方块仍然会加速,但速度会比前面的例子慢。

线性速度是物体运动的度量,或者说物体在一段时间内沿一个轴改变其位置的速度。Studio根据物体每秒移动多少个stud来测量线性速度。Stud是Roblox用于测量长度的主要物理单位,每个stud大约等于现实世界中的28厘米。

理解线性速度对于设计游戏玩法非常重要,因为它帮助您确定为了实现移动物体的特定速度需要施加多少力。例如,当您想要将物体向上推动时,考虑如何调整您的力以克服环境中的重力是很重要的,以便物体能够准确移动。
以下部分将深入探讨这些概念,您将学习如何以恒定或初始线性速度移动物体,并施加必要的力以克服环境中的任何抵抗物理力。在您回顾即将到来的技术时,您可以更准确地预测如何调整属性值,以实现Studio中任何理想的线性运动行为。
维持恒定线性速度
为了使物体达到并维持恒定的线性速度,它需要施加足够的力以克服任何抵抗物理力,这些力要么减缓物体的线性速度,要么使物体保持静止。例如,如果您希望物体在Studio中具有 [0, 12, 0] 的线性速度,您需要施加足够的力使物体在其环境中沿Y轴达到并维持每秒12个stud的速度。
所需的力不仅取决于环境中的抵抗物理力,例如重力和摩擦,还取决于物体本身。例如,如果您有两个形状相同的物体在同一轴上移动,质量较大的物体需要更多的力才能实现相同的线性加速度。
以下小节使用不同形状和大小的组件来教您如何以恒定线性速度移动整个物体或仅移动物体的一部分。当您尝试不同的属性值时,您将学习如何估算在您自己的游戏中组件所需的最大力。
使用LinearVelocity约束
LinearVelocity 对象是一种移动约束,它对整个组件施加力以维持恒定的线性速度。通过在运动过程中不将组件的位置锁定到一个轴,组件可以自由旋转,因为它与三维空间中的其他物体发生碰撞。这种类型的运动会导致令人惊讶的游戏场景,玩家更难以预测。
要开始移动组件,LinearVelocity 约束需要知道:
- 施加力的点和正向或负向方向。
- 您希望组件每秒移动的stud数量。
- 引擎可以施加的最大力,以使组件达到恒定的线性速度。
为了演示这个过程,您将配置一个睡莲垫,并添加一个 LinearVelocity 约束,以使睡莲垫以每秒15个stud的速度沿世界的负X轴以恒定的线性速度移动。

添加附件
您可以通过向组件添加一个 Attachment 对象来指定施加力的点,然后配置附件在三维空间中的位置。样本移动物体游戏在睡莲垫的中心放置了一个附件,以便约束可以沿特定轴从附件移动网格。
附件包括可视化辅助工具,帮助您可视化它们的运动轴。黄色箭头表示附件的主要轴,橙色箭头表示附件的次要轴。虽然在本技术的步骤中,任何运动轴都不会影响睡莲垫的运动,但了解这些可视化辅助工具对于将来的参考是很重要的,因为它们可以帮助您确定不同类型约束的理想行为,例如下一种技术中的 PrismaticConstraint。

要添加附件:
在 Explorer 窗口中,展开 LinearVelocityExample 文件夹,然后展开其子文件夹 LilyPad_DIY 模型。
在 Pad 网格中插入一个附件。
- 将鼠标悬停在网格上并单击 ⊕ 按钮。上下文菜单显示。
- 从菜单中插入一个 Attachment。附件显示在部件的中心。
- 将附件重命名为 MoveAttachment。

配置约束
现在您的网格有了一个固定点来移动睡莲垫,您可以配置 LinearVelocity 约束的属性,以指定恒定线性速度的方向和大小、您希望网格每秒移动的stud数量,以及引擎可以施加的最大力,以使网格达到恒定线性速度。
样本移动物体游戏施加最多5000 Rowtons的恒定力,以使睡莲垫沿世界的负X轴以恒定线性速度每秒移动15个stud。Rowtons是Roblox用于测量力的主要物理单位。有关Roblox物理单位及其如何转换为公制单位的信息,请参见Roblox单位。
要配置 LinearVelocity 约束:
要使约束在视口中可见,以便您可以参考其线性方向,请在Studio的 View 菜单中启用 Show Constraint Details。
在 Pad 网格中插入一个 LinearVelocity 约束。
- 在 Explorer 窗口中,将鼠标悬停在网格上,然后单击 ⊕ 图标。上下文菜单显示。
- 从上下文菜单中插入 LinearVelocity。
将网格的附件分配给新约束。
- 在 Explorer 窗口中,选择约束。
- 在 Properties 窗口中,
- 将 Attachment0 设置为 MoveAttachment。
- 将 MaxForce 设置为 5000,以施加最多5000 Rowtons的恒定力以达到目标线性速度。
- 将 RelativeTo 保持为 World,以使睡莲垫相对于世界的位置和方向移动。
- 将 VelocityConstraint 设置为 Line,以沿着从附件的线约束力。
- 将 LineDirection 设置为 -1, 0, 0,以使睡莲垫沿世界的负X轴移动。请注意,如果您将此属性设置为 1, 0, 0,则睡莲垫将沿世界的正X轴移动。
- 将 LineVelocity 设置为 15,以使睡莲垫每秒移动15个stud。

验证您设置的力使网格沿世界的负X轴以每秒15个stud的速度移动。
从夹层的下拉菜单中选择 Run 模拟模式,然后单击 Play 按钮以开始。Studio在当前相机位置模拟游戏,而没有您的角色在三维空间中。

使用PrismaticConstraint约束
PrismaticConstraint 对象是一种机械约束,它在两个附件之间创建一个刚性连接,允许它们的父组件沿一个轴相对彼此移动。通过将两个组件的位置锁定到一个轴上,每个组件只能在同一方向一起旋转。
这种类型的运动会导致稳定的游戏场景,玩家更容易预测。例如,样本移动物体游戏使用 PrismaticConstraint 对象移动玩家可以小心穿越的巨型河流上的木头平台。
当您将 PrismaticConstraint.ActuatorType 设置为 Motor 时,此约束在两个附件上施加力,目标是使附件达到并维持恒定的线性速度。如果您将其中一个附件的父组件固定,力将继续以恒定的线性速度移动未固定的组件,而固定的组件保持静止。
要开始移动组件,PrismaticConstraint 约束需要知道:
- 施加力的点和正向或负向方向。
- 您希望附件每秒移动的stud数量。
- 引擎可以施加的最大力,以使附件及其父组件达到恒定的线性速度。
为了演示这个过程,您将配置一个木头组件,其中有两个对象具有子附件,PrismaticConstraint 引用这些附件,以使木头以每秒40个stud的速度沿世界的负X轴以恒定的线性速度移动。

配置附件
您可以通过向组件添加两个 Attachment 对象来指定在组件内移动特定物体的方向,然后配置它们在三维空间中的对齐和方向。样本移动物体游戏在未固定的木头与固定部分重叠的位置附近沿世界的X轴对齐两个附件,并将每个附件的主要轴定向朝向世界的负X轴。
当您在下一部分配置PrismaticConstraint约束时,它将相对于锚定部分移动木头。换句话说,木头将远离无法移动的静止部分,因为它在三维空间中是固定的。
要为棱柱约束配置附件:
在 Explorer 窗口中,展开 PrismaticConstraintExample 文件夹,然后展开其子文件夹 Log_DIY 模型。
在 Log 网格中插入一个附件。
- 将鼠标悬停在网格上并单击 ⊕ 按钮。上下文菜单显示。
- 从菜单中插入一个 Attachment。附件显示在部件的中心。
- 将附件重命名为 LogAttachment。

使用相同的过程,在 Anchor 部件中插入一个附件,然后将附件重命名为 AnchorAttachment。

使用 View Selector 工具作为世界坐标的参考,旋转 LogAttachment 和 AnchorAttachment,直到每个附件的主要轴面向世界的负X轴。

重新定位 AnchorAttachment,使两个附件在世界的X轴上对齐。

配置约束
现在您的附件在同一轴上对齐并面向您希望木头移动的方向,您可以配置 PrismaticConstraint 约束的属性,以指定是否在每个附件的主要轴的正向或负向施加目标恒定线性速度,您希望附件每秒移动的stud数量,以及引擎可以施加的最大力,以使木头达到恒定的线性速度。
虽然您可以为自己的用例选择不同的值,但样本移动物体游戏施加最多50000 Rowtons的恒定力,以使附件沿世界的负X轴以恒定线性速度每秒移动40个stud。然而,由于锚定附件在一个固定的物体中,只有木头的附件可以移动。
要配置棱柱约束:
在 Log 网格中插入一个 PrismaticConstraint 对象。
- 在 Explorer 窗口中,将鼠标悬停在网格上,然后单击 ⊕ 图标。上下文菜单显示。
- 从上下文菜单中插入一个 PrismaticConstraint。
将木头的附件分配给新约束,以便木头相对于锚定的块部分移动。
- 在 Explorer 窗口中,选择约束。
- 在 Properties 窗口中,
- 将 Attachment0 设置为 AnchorAttachment。
- 将 Attachment1 设置为 LogAttachment。约束在视口中显示。

在 Explorer 窗口中,选择约束,然后在 Properties 窗口中:
- 将 ActuatorType 设置为 Motor。新的属性字段显示。
- 将 MotorMaxForce 设置为 50000,以施加最多50000 Rowtons的恒定力以达到目标线性速度。
- 将 Velocity 设置为 40,以使木头每秒移动40个stud。

验证您设置的力使木头沿世界的负X轴以每秒40个stud的速度移动。
从夹层的下拉菜单中选择 Run 模拟模式,然后单击 Play 按钮以开始。Studio在当前相机位置模拟游戏,而没有您的角色在三维空间中。

施加初始线性力
改变物体线性速度的另一种方法是施加冲力。在施加冲力后,如果存在摩擦等抵抗力,物体会减速直到静止,或者如果没有抵抗力,则保持以恒定线性速度运动。
这种技术在重大游戏事件后移动物体非常有用,例如爆炸或冲击碰撞,因为它为玩家提供了瞬时反馈。为了演示,以下小节教您如何在玩家的角色与跳跃垫碰撞时向上发射角色,使用初始冲力,您可以根据自己的游戏需求调整新值。
使用ApplyImpulse
ApplyImpulse 方法对整个组件施加力,以获得初始线性速度,然后在存在抵抗力时减速停止。要开始移动组件,该方法需要知道:
- 要移动的组件。
- 施加力以达到初始线性速度的轴。
- 施加到每个轴的力的大小。
您可以在脚本中定义所有这些值。例如,样本脚本将要移动的组件定义为玩家角色的 Humanoid 对象,然后施加2500 Rowton-秒的冲力,以在世界的正Y轴上将玩家向上发射。请注意,玩家角色的质量不同,因此您可能需要增加并平衡此力,以便将每个玩家发射到适当的高度,而不会将质量较小的玩家发射得过高。
要使用 ApplyImpulse 移动组件:
在 Explorer 窗口中,展开 ApplyImpulseExample 文件夹,然后展开其子文件夹 JumpPad_DIY 模型。
在 JumpPad 部件中插入一个脚本。
- 将鼠标悬停在部件上并单击 ⊕ 按钮。上下文菜单显示。
- 从菜单中插入一个 Script。附件显示在部件的中心。
- 将脚本重命名为 JumpScript。
用以下代码替换默认代码:
local volume = script.Parentlocal function onTouched(other)local impulse = Vector3.new(0, 2500, 0)local character = other.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid and other.Name == "LeftFoot" thenother:ApplyImpulse(impulse)endendvolume.Touched:Connect(onTouched)