动态零件

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

玩家可以获得是否与动画有关的反馈。这可以是树摇动时发生的树摇晃动,或者玩家喂食时宠物欢喜地弹出。在这种情况下,我们会显示玩家如何在玩家点击时移动按钮。

与动画渐变

对对象的动画有两种方法:使用 tweens 。一个 tween ,也就是在-之间,是过一定时间变更起始值到最终值的过程。渐变可以用来改变位置、颜色或旋转等属性。

项目设置

对于此项目,调整因子将一个对象从起始位置移动到目标位置。

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

  2. 在移动工具动的部分中,添加一个名为 ClickDetector 的点击检测器和一个名为 TweenMove 的脚本。 不要重命名 ClickDetector。

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


    -- 根据选定的轴对零件进行 T 形逆时针旋转
    -- 按钮有一个开/关状态,可以将零件向前或向后移动
    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
    -- 在 tween 完成后,按钮再次可用
    tweenButton.Completed:Connect(function()
    inTween = false
    -- 反向按钮状态
    buttonState *= -1
    end)
    end
    clickDetector.MouseClick:Connect(buttonPress)
  4. 播放测试并单击对象。 在测试时,您可能会注意到对象移动错误的方向或距离。 您可以在下一节中自定义。

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

调整移动�ween

添加了脚本后,您可以根据您的游戏需要自定义它。 按钮可以调整为前进、向后退出、向返回或向下移动。

改变位置

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

在那个行上,使用 X、Y 和 Z 坐标创建了一个新的 CFrame。在此示例中,按钮移动在其 Y 轴上。


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

要使按钮在 不同的 方向移动,请使用以下线将其中一个欲要的坐标替换为线: TWEEN_MOVE_DISTANCE * buttonState 。将其他坐标设置为 0。

例如,这条线将相反地将其移动到 X 轴。


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

调整时间和距离

脚本包含影响 tween 补间动画动的以下变量。大写名称如 TWEEN_TIME 用于指定此脚本的特定修改。

尝试改变以下变量的值:

  • 行 11 - TWEEN_TIME : 渐变时间(秒)。
  • 行 12 - TWEEN_MOVE_DISTANCE : 按钮移动的距离。

调整其他属性

大多数具有数字数据类型的属性都可以调整。这部分包括一些常见属性,例如旋转,可以用于让更多玩家回馈您的游戏。请注意,您也可以调整多个属性。

了解有关完整列表的属性,请参阅TweenService API 页面。

旋转

对于旋转,请结合使用 Vector3 和 CFrames 而不是只使用它们。 旋转 tweens 可以让创建物体时,宠物或硬币扭动,当它们被捡起时。

在下一个脚本示例中,该生物的位置和旋转都是随机设置,当单击时显示它是多么开心。

下面的代码将根据在 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. 使用 SpecialMesh 而不是 MeshPart 。这是因为 MeshPart 的材质会覆盖脚本所涂色的颜色。

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

项目示例

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

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

>