動畫零件

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

玩家可以獲得反饋,他們的行動是否與動畫有關。這可能是樹木在被擊中時搖晃或寵物在被餵食時跳躍。在這個例子中,我們會教你如何製作一個按鈕,當玩家單擊時會移動。

使用動畫的過渡

動畫對象的一種方式是使用青少年。一個 過度 ,簡稱中途,是將起始值變更為結束值的過程,在特定時間內。青少年可以用來變更位置、顏色或旋轉等屬性。

項目設定

對於這個項目,青少年將從起始位置移動對象到目標位置。

  1. 決定你要動畫的部分。在下面的例子中,1 是按鈕,2 是牆壁。

  2. 在將移動工具動的部分中,添加一個點擊偵測器和名為「TweenMove」的腳本。不要重命名點擊偵測器。

  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)

若要按鈕以不同的 方向移動 ,只需將所需的坐標之一替換為線:TWEEN_MOVE_DISTANCE * buttonState。將所有其他坐標設為 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

旋轉

為了旋轉,結合暫停和 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上使用這個。網格零件通常會匯入 3D 模型,而不是直接在 Roblox Studio 中建造零件。

如果您使用完全紋理的MeshPart進行工作,我們建議以追蹤中內容:

  1. 使用特殊網格而不是網格零件。這是因為網格零件的紋理覆蓋了由腳指令碼調色的顏色。

  2. 將腳本變更為修改特殊網格的 vertexColor 而不是顏色屬性。

項目樣本

查看此非複製鎖定空間中的所有腳本範例。獲得所有腳本以進行修改。

包括用於旋轉、縮放和顏色變更的腳本青少年。