创建移动对象

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

移动对象 是在3D空间内移动在一个或多个轴上的对象。使用 Roblox 模拟引擎内置的力量,您可以以仿真现实世界物理行为的方式让对象移动并与环境互动,例如重力、空气动力和摩擦。

使用 移动对象.rbxl 作为参考,本教程解释了物理力如何影响 Studio 的线性运动,并向您展示各种技巧可以将对象从 A 点移至 B 点的经验,其中包括指导如何:

  • 使用 LinearVelocity 移动限制以恒定线速度移动整个装配。
  • 使用 PrismaticConstraint 来限制装配到单个轴并以相对于 3D 空间的恒定线速度移动它。
  • 使用 ApplyImpulse 方法移动一个装配,其初始推力为力,以便装配在一段时间内慢慢减速。

线性运动和物理力

Roblox Studio 是一种实时模拟现实世界的物理行为的工程,因此,为了预测线性移动物体在体验中的行为,重要的是要有对物体在现实生活中以线性运动移动的高级理解。 线性运动 是沿轴移动。例如,当块具有线性运动时,它沿设定的轴移动。

A gray block in front of a dark background. The movement axis is highlighted, and it faces toward the left of the screen to signify that the block is going to move along the world's Y axis.

线性运动不能没有外部物理力推动或拉动物体移动。根据牛顿的第一运动定律,静止物体仍然静止,移动物体仍然以恒定速度移动,除非它们受到外部力的影响。例如,静止块除非受到风等物理力的推动才会保持静止。

是物体沿轴变换线速度的方向和大小的物理推拉的量度。速度的变化被称为 加速 。这个概念对于在工作室移动对象特别重要;你对对象施加的力越多,它们的加速速度就越快。

这是因为力必须大于任何物理力推回对象,例如重力或摩擦。例如,如果你将块放置在金属板上,风的物理力需要克服金属板的摩擦量以继续加速块。如果风的力不大于金属板的摩擦力,块就会加速,但速度比前一个例子慢得多。

A gray block in front of a dark grey metal plate with a diagram that signifies the block will have a plate friction to slow the block's movement from the wind.

线速度 是对物体运动的测量,或物体在一定时间段内沿轴更改位置的速度。工作室根据物体每秒移动的距离来测量线速度。螺柱是 Roblox 测量长度的主要物理单位,每个螺柱相当于现实世界的约 28cm。

A gray block in front of the default baseplate's 4x4 grid texture. A single stud cube rectangle is highlighted.

了解线速度对于设计体验中的游戏玩法非常重要,因为它可以帮助你确定你需要多少力来实现特定速度的移动物体。例如,当你想将对象向上推动时,你必须考虑如何调整力以克服环境中的重力,使对象准确移动。

以下部分进一步深入这些概念,当您学习如何在恒定或初始线速度下移动对象以克服环境中的任何反对物理力时,需要必要的力量。当您使用即将推出的技术审查这些物理概念时,您可以更准确地预测如何调整属性值以实现 Studio 中任何理想的线性运动行为。

保持恒定的线速度

要使对象达到并保持恒定的线速度,它需要克服任何反对物理力,这些力要么减慢对象的线速度,要么使对象保持静止。例如,如果你想让一个对象在 Studio 中的线速度为 [0, 12, 0] ,你需要足够的力量让对象在环境中的 Y 轴上每秒钟达到并维持 12 个螺柱。

需要的力量不仅取决于环境本身的反对物理力,例如重力和摩擦,还取决于对象本身。例如,如果您有两个相同形状的对象在同一轴上移动,那么需要更多的力来实现相同的线性加速。

小三角形部分的质量很小,因此需要较少的力来实现相同的加速。
大三角形部分的质量很大,因此需要更多的力来实现相同的加速。

以下部分使用不同形状和尺寸的装配来教你如何以恒定的线速度移动整个对象或仅部分对象。当你用不同的属性值进行实验时,你将学习如何估算你在自己的经验中需要的最大力量。

使用线速度约束

LinearVelocity 对象是一种类型的 移动约束 ,可以对整个装配施加力以维持恒定的线速度。通过在运动期间不锁定装配的位置到轴,装配可以在碰撞其他对象时在 3D 空间中自由旋转。这种类型的运动会导致令玩家更难预测的惊人游戏场景。

当百合垫与彼此碰撞时,它们会改变方向,但仍以恒定的线速度向河流下流。

要开始移动组装,限制 LinearVelocity 需要知道:

  • 应用力的点和正或负方向。
  • 您希望装配每秒移动的螺柱数量。
  • 引擎可以为装配达到恒定线速度的最大力量。

为了展示此过程,您将配置一个附件,该附件引用 LinearVelocity 约束限制以每秒钟沿世界负X轴移动百合垫15 个螺柱。

A close up view of a lily pad. The lily pad's constraint visual aid is visible, and it points to the right, which is the world's negative X axis.

添加附件

您可以通过添加 Attachment 对象到装配来指定应用力的点,然后在 3D 空间中配置附件的位置。样例 移动对象 体验将附件放在百合垫的中心,以便约束可以从附件沿特定轴移动网格。

附件包括视觉助助,可帮助您视觉化其运动轴。黄色箭头表示附件的主轴,橙色箭头表示附件的次要轴。虽然没有运动轴对此技巧步骤中的百合垫移动有影响,但重要的是要理解这些视觉帮助因素,因为它们可以帮助您确定不同类型约束的理想行为,例如下一技巧中的 PrismaticConstraint

A attachment's visual aid arrows. The yellow arrow that signifies the attachment's primary axis points up, and the orange arrow that signifies the attachment's secondary axis points to the right.

要添加附件:

  1. 探索器 窗口中,扩展 线速度示例 文件夹,然后扩展其子 LilyPad_DIY 模型。

  2. 将附件插入 平板 网格。

    1. 将鼠标悬停在网格上并单击⊕按钮。将显示上下文菜单。
    2. 从菜单中插入 附件 。附件会显示在零件的中心。
    3. 将附件重命名为 移动附件
    A close up view of a lily pad and its attachment visual aid. The primary axis points away from the camera, and the secondary axis points upward.

配置约束

现在你的网格有一个固定点来移动百合垫,你可以配置 LinearVelocity 约束的属性来指定恒定线速度的方向和大小、你想要网格每秒移动的钉子数量以及引擎可以为网格达到恒定线速度的最大力量。

样例 移动物体 体验可以施加高达 5000 牛顿的恒定力来在世界上的负X轴上每秒移动百合垫 15 格。罗顿是 Roblox 的主要物理单位,用于测量力。要参考 Roblox 物理单位以及它们如何转换为公制单位,请参阅 Roblox 单位

要配置一个 LinearVelocity 约束:

  1. (可选) 使约束在 3D 空间中可见,以便您可以引用其线性方向。

    1. 导航到工具栏的 模型 选项卡,然后导航到 约束 部分。
    2. 如果目前未启用,请单击 约束详情 显示约束视觉助助。
    A close up view of the Studio's Constraints section UI.
  2. LinearVelocity 约束插入 平板 网格。

    1. 探索器 窗口中,将鼠标悬停在网格上,然后单击 ⊕ 图标。将显示上下文菜单。
    2. 从上下文菜单中插入 线速度
  3. 将网格的附件分配到新约束。

    1. 探索器 窗口中,选择约束。
    2. 属性 窗口中,
      1. 附件0 设置为 移动附件
      2. 最大力 设置为 5000 以施加最多 5000 牛的恒定力来实现目标线速度。
      3. 相对于世界 保留给 世界 以移动百合垫相对于世界的位置和方向。
      4. 速度约束 设置为 线 来限制附件沿线的力。
      5. 线向导 设置为 -1, 0, 0 以沿世界负 X 轴移动百合垫。请注意,如果你将此属性设置为 1, 0, 0,百合垫将沿世界的正向 X 轴移动。
      6. 线速度 设置为 15 以每秒移动百合垫 15 格。
    A close up view of a lily pad and its constraint visual aid arrow that points to the right, or the world's negative X axis.
  4. 验证你设置的力量移动网格每秒沿世界负X轴移动15格。

    1. 在工具栏中,导航到 测试 选项卡。
    2. 从游戏测试模式中选择 运行 。Studio 在当前摄像头位置模拟体验,没有你的虚拟形象在 3D 空间中。
    Rapid playtest options in Studio.

使用棱镜约束限制

PrismaticConstraint 对象是一种类型的 机械限制 ,可以在两个附件之间创建一个刚性连接,允许其父集装件沿一个轴向相对于彼此移动 相对于彼此 。通过将两个装配的位置锁定在单个轴上,每个装配只能在同一方向上一起旋转,如果它们在同一方向上旋转。

这种类型的运动会导致更容易预测的稳定游戏场景。例如,示例 移动对象 体验使用 PrismaticConstraint 对象移动玩家可以用来小心穿过巨大河流的登录平台。

当你将 PrismaticConstraint.ActuatorType 设置为 发动机 时,这个约束对附件的两个附件施加力,以实现附件的达到和维持恒定线速。如果您锁定附件的父集装体之一,力继续在恒定的线速度下移动未锁定的集装体,而锁定的集装体保持静止。

要开始移动组装,限制 PrismaticConstraint 需要知道:

  • 应用力的点和正或负方向。
  • 你想要附件每秒移动的距离。
  • 引擎可以为附件和其父集装件申请的最大力量,以达到恒定的线速度。

为了展示此过程,您将配置一个包含两个具有子附件的日志集合,该日志集合以恒定的线速度在世界上的负X轴上每秒移动40个螺柱。

A close up view of a brown log on top of a river. The log's constraint visual aid is visible and points to the right, or the world's negative X axis.

配置附件

您可以通过将两个 Attachment 对象添加到装配中来指定在装配中移动特定对象的方向,然后在 3D 空间中配置其对齐和方向。样例 移动对象 体验沿世界 X 轴向位置对齐两个附件,并将每个附件的主轴向世界的负 X 轴转向。

当你在下一节配置你的棱镜约束限制时,它会将日志 相对 移至锚部分。换言之,日志将远离无法移动的静止部分,因为它被固定在 3D 空间中。

要配置棱镜约束的附件:

  1. 探索器 窗口中,扩展 棱镜约束示例 文件夹,然后扩展其子 Log_DIY 模型。

  2. 将附件插入 日志 网格。

    1. 将鼠标悬停在网格上并单击⊕按钮。将显示上下文菜单。
    2. 从菜单中插入 附件 。附件会显示在零件的中心。
    3. 将附件重命名为 日志附件
    A close up view of a log and its attachment visual aid. The primary axis points toward the camera, and the secondary axis points upward.
  3. 使用相同的过程,将附件插入 部分,然后重命名附件 锚附件

    A close up view of a log and two attachment visual aids. The primary axis of the new attachment visual aid points to the right, and the secondary axis points upward.
  4. 使用 视图选择器 工具作为世界坐标的参考,旋转 LogAttachmentAnchorAttachment 直到每个附件的主轴面向世界的负X轴

    A close up view of a log and its attachment visual aid. Both attachments have a primary axis that points to the right, and a secondary axis that points upward.
  5. 重新定位 锚附件 以使两个附件都对世界的 X 轴保持一致。

    A close up view of a log and its attachment visual aids that are now positioned horizontally. Both attachments have a primary axis that points to the right, and a secondary axis that points upward.

配置约束

现在你的附件已经对齐在同一轴上,面向你希望日志移动的方向,你可以配置 PrismaticConstraint 约束的属性来确定是否在每个附件的主轴的正向或负向应用目标常量线速度、每秒移动的附件数量和引擎可以为日志达到恒定线速度的最大力量。

虽然您可以为自己的应用案例选择不同的值,但示例 移动物体 体验可以将高达 50000 牛顿的恒定力应用于世界上负X轴上的附件,以每秒移动 40 度的恒定线速度。然而,由于锚定附件位于锚定对象中,只有日志附件才能移动。

要配置棱镜约束:

  1. PrismaticConstraint 对象插入到 日志 网格。

    1. 探索器 窗口中,将鼠标悬停在网格上,然后单击 ⊕ 图标。将显示上下文菜单。
    2. 从上下文菜单中插入一个 棱镜约束
  2. 将日志附件分配到新约束,使日志在 关于 锚定块部分移动。

    1. 探索器 窗口中,选择约束。
    2. 属性 窗口中,
      1. 附件0 设置为 锚定附件
      2. 附件1 设置为 日志附件 。约束在视窗中显示。
    A close up view of a log and its constraint visual aid. It doesn't have a arrow visual aid because it doesn't yet have a set velocity.
  3. Explorer 窗口中选择约束,然后在属性窗口中,

    1. 执行器类型 设置为 发动机 。新的属性显示字段。
    2. 发动机最大力 设置为 50000 以施加最多 50000 牛的恒定力来实现目标线速度。
    3. 速度 设置为 40 以每秒移动 40 个螺柱。
    A close up view of a log and its constraint visual aid arrow that points to the right, or the world's negative X axis.
  4. 验证你设置的力量移动量每秒沿世界负X轴移动40格记录。

    1. 在工具栏中,导航到 测试 选项卡。
    2. 从游戏测试模式中选择 运行 。Studio 在当前摄像头位置模拟体验,没有你的虚拟形象在 3D 空间中。
    Rapid playtest options in Studio.

应用初始线性力

另一种改变对象线速度的方法是通过应用力脉冲来实现。在力的脉冲之后,对象要么减速直到静止,如果存在摩擦力等反向力,或者保持恒定的线速度,如果没有反向力。

这种技术对于在重大游戏事件后移动对象,例如爆炸或具有影响力的碰撞,很有用,因为它可以为玩家提供即时反馈。为了说明,下面的子节教你如何在碰撞到跳跃板时启动玩家角色向天空方向上升时,如何使用新值来适应你自己的游戏需求。

使用 ApplyImpulse

ApplyImpulse 方法对整个装配施加力,在有反向力时减速到停止之前获得初始线速度。要开始移动组件,方法需要知道:

  • 要移动的装配。
  • 用于施加力以达到初始线速度的轴。
  • 应用于每个轴的力量量。

您可以在脚本中定义所有这些值。例如,示例脚本定义了装配移动到玩家角色的 Humanoid 对象,然后应用 2500 行顿秒的力脉冲向上发射玩家在世界上的正向 Y 轴。请注意,玩家角色的质量不同,因此您可能需要增加并平衡这种力量,以发射每个玩家,而不是发射更少质量的玩家角色太高。

使用 ApplyImpulse 移动装配:

  1. 探索器 窗口中,扩展 ApplyImpulseExample 文件夹,然后扩展其子 JumpPad_DIY 模型。

  2. 将脚本插入 JumpPad 部分。

    1. 将鼠标悬停在零件上并单击⊕按钮。将显示上下文菜单。
    2. 从菜单中插入 脚本 。附件显示在零件中央。
    3. 将脚本重命名为 JumpScript
  3. 将默认代码替换为以下代码:


    local volume = script.Parent
    local function onTouched(other)
    local impulse = Vector3.new(0, 2500, 0)
    local character = other.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid and other.Name == "LeftFoot" then
    other:ApplyImpulse(impulse)
    end
    end
    volume.Touched:Connect(onTouched)