BodyPosition

Time:5 分钟

当实践本教程时,请处于 Roblox Studio 中。一些开发者可能并不熟悉 BodyPosition(主体位置)的定义:BodyPosition 是使用 Roblox 模拟物理移动游戏中对象的一种方法。对象将会尝试移动至主体位置所指定的点,并尝试施加既定的力。在许多特定情况下可以运用主体位置的这一特性。举例来说,通过 BodyPosition 为对象在 Y 轴(上下方向)上定义较大的力,而在 X 和 Z 轴(分别为左右方向和前后方向)上定义较小的力。这样就能将该对象转变为能够自由移动的漂浮物体。当创建悬停飞行载具或船只时,主体位置将会十分有用。在对其进行利用时需要注意:虽然部件会尝试前往指定点,但并非一定会到达该位置。如果在其路径上存在锚固的其它对象,则该部件很可能无法到达目标位置。

起始设置

  1. 创建砖型小型部件(示例尺寸:5 x 1 x 5)。

  2. 选中该砖块,单击 Insert(插入) -> Object(对象) -> Script(脚本)

  3. 双击新的脚本对象。

代码

双击脚本对象后,应当会显示以下内容:

print("Hello World!")

由于本示例不需要这些文本,请将其进行删除。下面我们将会逐步解释放入该脚本的示例代码:

function onTouched(hit)

上述代码的作用是当此对象被触碰时对触碰事件进行检测。

local character = hit.Parent
if character and character:findFirstChild("Humanoid") then

而这一段代码将会检测对砖块进行触碰的是否为 Humanoid(人形对象)。我们希望由人形对象触发主体位置,而非火箭炮或者弹弓弹丸等部件。

local b = Instance.new("BodyPosition")

上述代码对 BodyPosition 对象进行了定义。但因为我们尚未定义其父项,该主体位置目前没有任何作用。

b.position = Vector3.new(500, 500, 500)
b.maxForce = Vector3.new(500000000, 500000000, 500000000)
b.Parent = character.Torso

这几行代码将会定义 BodyPosition 的一部分属性。

  • BodyPosition 的 position 属性作用:当 BodyPosition 拥有父项时,此属性将会使父项前往 BodyPosition 的 position 属性位置。此属性的用途很多。举例来说,当希望进行传送而不使用传送功能时,即可利用该属性。

  • BodyPosition 的 maxForce 属性作用:该属性定义了向父项的每个轴上施加的力度,同时也控制了 BodyPosition 在将对象移动至其 position(位置)属性前其所能达到的最远位置。

  • BodyPosition 的 Parent(父项)作用:BodyPosition 的父项就是其所将移动的对象。在本示例中,我们将会移动游戏角色的 Torso(躯干)。

目前为止的代码应当如下所示:

function onTouched(hit)
    local character = hit.Parent
    if character and character:findFirstChild("Humanoid") then
        local b = Instance.new("BodyPosition")
        b.position = Vector3.new(500, 500, 500)
        b.maxForce = Vector3.new(500000000, 500000000, 500000000)
        b.Parent = character.Torso

这段代码会让游戏角色飞行到 BodyPosition 的指定位置,但角色将不会落地。下面让我们来修复这一问题:

         wait(3)
         b.Parent = nil

加入上述代码后, BodyPosition 将在 3 秒钟后不复存在,而角色也将会随之落地。之后我们只需对函数进行清理,然后将其连接到 Touched 属性即可:

     end
end
script.Parent.Touched:connect(onTouched)

加入 end 后,即可结束 if 语句和函数。整个脚本现在应当如下所示:

function onTouched(hit)
    local character = hit.Parent
    if character and character:findFirstChild("Humanoid") then
        local b = Instance.new("BodyPosition")
        b.position = Vector3.new(500, 500, 500)
        b.maxForce = Vector3.new(500000000, 500000000, 500000000)
        b.Parent = character.Torso
        wait(3)
        b.Parent = nil
    end
end
script.Parent.Touched:connect(onTouched)

若希望变更角色前往的位置,则可以更改 BodyPosition 的 position 属性。当将 wait 的时间改为 0.1 秒时(即 wait(0.1)),BodyPosition 的父项角色将会飞起来,十分有趣!

另请参阅

  • BodyPosition

  • Datatype/Vector3

Roblox官方链接:BodyPosition