动画零件

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

玩家可以获得反馈,他们的行动是否与动画有关。当击中时,这可能是一棵树在颤抖,或宠物在被喂食时欢快跳跃。在这种情况下,我们将向您展示如何制作一个按钮,当玩家单击它时移动。

使用动画进行过渡

动画对象的一个方法是使用青少年。一个 过渡 , 简称中间过程, 是在一定时间内将起始值更改为最终值的过程。青少年可用于更改属性,例如位置、颜色或旋转。

项目设置

对于这个项目,一个青少年将从起始位置移动对象到目标位置。

  1. 确定你要动画的部分。在下面的例子中,1 是按钮,而 2 是墙壁。

  2. 在将移动工具动的部分中,添加 ClickDetector 和名为 TweenMove 的脚本。不要重命名 ClickDetector。

  3. 打开 TweenMove 脚本。然后,复制并粘贴以下脚本。


    -- 根据选定的轴向前向后拆分零件
    -- 按钮有一个开启/关闭状态,可以向前或向后移动零件
    local TweenService = game:GetService("TweenService")
    local button = script.Parent
    local clickDetector = button:FindFirstChildWhichIsA("ClickDetector")
    local buttonState = -1 -- 确定按钮方向;-1 表示它将按下,1 表示它将弹出
    local inTween = false
    -- 可定制的变量
    local TWEEN_TIME = 0.15
    local TWEEN_MOVE_DISTANCE = 1.5
    -- 过渡变量
    local buttonTweenInfo = TweenInfo.new(
    TWEEN_TIME, -- 时间
    Enum.EasingStyle.Quad, -- 倾斜风格
    Enum.EasingDirection.Out -- 减轻方向
    )
    local function buttonPress()
    -- 如果按钮正在转换,防止它再次使用
    if inTween == true then
    return
    end
    -- 计算按钮位置的新 CFrame
    local offsetCFrame = CFrame.new(0, TWEEN_MOVE_DISTANCE * buttonState, 0)
    local newCFrame = button.CFrame:ToWorldSpace(offsetCFrame)
    -- 创建一个青少年并播放它
    local tweenButton = TweenService:Create(button, buttonTweenInfo, {CFrame = newCFrame})
    tweenButton:Play()
    inTween = true
    -- 在青少年完成后,让按钮再次可用
    tweenButton.Completed:Connect(function()
    inTween = false
    -- 反转按钮状态
    buttonState *= -1
    end)
    end
    clickDetector.MouseClick:Connect(buttonPress)
  4. 进行游戏测试并单击对象。在测试时,您可能会注意到对象移动错误的方向或距离。这可以在下一节中自定义。

方向错误;需要调整
移动正确;无需调整

调整移动补间动画

添加了脚本后,您可以自定义它以满足游戏的需求。按钮可以在向前、向返回、向上和向下等方向移动。

更改位置

请记住,青少年从起始值转变为目标值。该脚本使用 CFrames 将按钮移动到相对于其当前位置的方向。该方向在脚本的 第 28 行 中被控制。

在那条线上,使用 X、Y 和 Z 坐标创建了一个新的 CFrame。在这个例子中,按钮相对于其 Y 轴移动。


-- 计算按钮位置的新 CFrame
local offsetCFrame = CFrame.new(0, TWEEN_MOVE_DISTANCE * buttonState, 0)
local newCFrame = button.CFrame:ToWorldSpace(offsetCFrame)

要使按钮在不同的 方向移动,只需要将所需的坐标之一替换为线: 。将所有其他坐标设置为 0。

例如,这行会将其相对于其 X 轴移动。


-- 计算按钮位置的新 CFrame
local offsetCFrame = CFrame.new( TWEEN_MOVE_DISTANCE * buttonState, 0, 0)
local newCFrame = button.CFrame:ToWorldSpace(offsetCFrame)

过渡时间和距离

该脚本包含以下变量,影响青补间动画的移动。像 TWEEN_TIME 这样的大写名称专门用于修改此脚本。

尝试更改以下变量的值:

  • 线 11 - TWEEN_TIME : 发生青少年的时间(秒)。
  • 第 12 行 - TWEEN_MOVE_DISTANCE : 按钮移动的距离,以点为单位。

转换其他属性

大多数具有数字数据类型的属性可以挤在一起。本节包含一些常见属性,例如旋转,可用于将更多玩家反馈带入您的游戏。请记住,您也可以一次保留多个属性。

要查看完整的属性列表,请参阅 TweenService API 页面。

旋转

为了旋转,结合渐变和 CFrames 而不仅仅使用 Vector3。旋转青少年可用于使生物在抚摸时摆动,或当它们被捡起时旋转硬币。

在下一个脚本示例中,当单击以显示它被宠物时的快乐程度时,生物的位置和旋转都被调整为中等,以显示它被宠物时的快乐程度。

以下代码将根据 TWEEN_ROT_ANGLES 中的度数旋转一个对象。


-- 使用拐点让对象旋转起来并弹出
local TweenService = game:GetService("TweenService")
local partToTween = script.Parent
local clickDetector = partToTween:FindFirstChildWhichIsA("ClickDetector")
local inTween = false
-- 可定制的变量
local TWEEN_TIME = 0.25
local TWEEN_ROT_ANGLES = -45
local TWEEN_MOVE_DISTANCE = 3
-- 过渡变量
local tweenInfo = TweenInfo.new(
TWEEN_TIME, -- 时间
Enum.EasingStyle.Quad, -- 倾斜风格
Enum.EasingDirection.Out, -- 减轻方向
1, -- 重复次数 (当小于零时,青少年会无限循环)
true -- 反向(一旦达到目标,中途将反向)
)
local function activateAction()
-- 如果对象正在转换,防止它再次转换
if inTween == true then
return
end
-- 计算对象位置和旋转的新 CFrame
local offsetCFrame = CFrame.new(0, TWEEN_MOVE_DISTANCE, 0)
local rotatedCFrame = CFrame.Angles(math.rad(TWEEN_ROT_ANGLES), 0, 0)
offsetCFrame = offsetCFrame:ToWorldSpace(rotatedCFrame)
local newCFrame = partToTween.CFrame:ToWorldSpace(offsetCFrame)
-- 创建一个青少年并播放它
local tweenObject = TweenService:Create(partToTween, tweenInfo, {CFrame = newCFrame})
tweenObject:Play()
inTween = true
-- 在青少年完成后,让对象再次可点击
tweenObject.Completed:Connect(function()
inTween = false
end)
end
clickDetector.MouseClick:Connect(activateAction)

缩放

改变游戏对象的大小也可以显示玩家与之交互。例实例,像健康包或宝石这样的拾取物会在触摸时缩小。要缩放零件,将中间目标更改为所需尺寸的新 Vector3。


-- 当零件被触摸时将其缩放,然后摧毁它
local TweenService = game:GetService("TweenService")
local partToScale = script.Parent
local inTween = false
-- 可定制的变量
local TWEEN_TIME = 1
local TWEEN_SCALE = Vector3.zero
-- 过渡变量
local tweenInfo = TweenInfo.new(
TWEEN_TIME, -- 时间
Enum.EasingStyle.Exponential, -- 倾斜风格
Enum.EasingDirection.Out -- 减轻方向
)
local function onPartTouch(otherPart)
-- 如果对象正在转换,防止它再次转换
if inTween == true then
return
end
local partParent = otherPart.Parent
local humanoid = partParent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- 防止对象进一步碰撞,因为它已被捡起
partToScale.CanCollide = false
-- 创建一个青少年并播放它
local tweenObject = TweenService:Create(partToScale, tweenInfo, {Size = TWEEN_SCALE})
tweenObject:Play()
inTween = true
-- 在青少年完成时,摧毁对象
tweenObject.Completed:Connect(function()
partToScale:Destroy()
end)
end
end
partToScale.Touched:Connect(onPartTouch)

颜色变化

零件可以通过使用 Color3 值进行过渡颜色。例实例,敌人或可破坏的对象可以闪烁颜色以反馈他们已被击中或单击。


-- 单击时将对象的颜色转换为另一个颜色,然后在 3 次点击后删除它
local TweenService = game:GetService("TweenService")
local partToTween = script.Parent
local clickDetector = partToTween:FindFirstChildWhichIsA("ClickDetector")
local inTween = false
-- 可定制的变量
local TWEEN_TIME = 0.2
local COLOR_ON_HIT = Color3.fromRGB(255, 0, 50)
local hitCount = 0
-- 过渡变量
local tweenInfo = TweenInfo.new(
TWEEN_TIME, -- 时间
Enum.EasingStyle.Exponential, -- 倾斜风格
Enum.EasingDirection.InOut, -- 减轻方向
0, -- 重复次数 (当小于零时,青少年会无限循环)
true -- 反向(一旦达到目标,中途将反向)
)
local function activateAction()
-- 如果对象正在转换,防止它再次转换
if inTween == true then
return
end
-- 创建一个青少年并播放它
local tweenObject = TweenService:Create(partToTween, tweenInfo, {Color = COLOR_ON_HIT})
tweenObject:Play()
inTween = true
-- 在青少年完成后,让对象再次可点击
tweenObject.Completed:Connect(function()
inTween = false
-- 增量命中计数
hitCount += 1
-- 在 3 次命中后,摧毁对象
if hitCount == 3 then
partToTween:Destroy()
end
end)
end
clickDetector.MouseClick:Connect(activateAction)

虽然这个脚本使用普通零件来更改颜色,但也可以使用这个在带有应用的纹理的MeshParts上。MeshParts经常导入 3D 模型,而不是在 Roblox Studio 直接构建零件。

如果您正在使用完全纹理的MeshPart,我们建议以关注中/正在关注内容:

  1. 使用特殊网格而不是网格部件。这是因为网格部件的纹理覆盖了脚本调色的颜色。

  2. 将脚本更改为修改特殊网格的 VertexColor 而不是颜色属性。

项目示例

查看此非复制锁定场景中的所有脚本示例。获取所有可修改的脚本。

包括用于旋转、缩放和颜色变更的青少年的脚本。