玩家可以獲得反饋,他們的行動是否與動畫有關。這可能是樹木在被擊中時搖晃或寵物在被餵食時跳躍。在這個例子中,我們會教你如何製作一個按鈕,當玩家單擊時會移動。
使用動畫的過渡
動畫對象的一種方式是使用青少年。一個 過度 ,簡稱中途,是將起始值變更為結束值的過程,在特定時間內。青少年可以用來變更位置、顏色或旋轉等屬性。
項目設定
對於這個項目,青少年將從起始位置移動對象到目標位置。
決定你要動畫的部分。在下面的例子中,1 是按鈕,2 是牆壁。
在將移動工具動的部分中,添加一個點擊偵測器和名為「TweenMove」的腳本。不要重命名點擊偵測器。
開啟 TweenMove 腳指令碼。然後,複製並粘貼下面的腳本。
-- 根據選擇的軸向前向後拆分零件-- 按鈕有開啟/關閉狀態,可以向前或向後移動零件local TweenService = game:GetService("TweenService")local button = script.Parentlocal clickDetector = button:FindFirstChildWhichIsA("ClickDetector")local buttonState = -1 -- 決定按鈕方向;-1 表示會向內按下,1 表示會向外跳出local inTween = false-- 可自訂變數local TWEEN_TIME = 0.15local TWEEN_MOVE_DISTANCE = 1.5-- 青少年變量local buttonTweenInfo = TweenInfo.new(TWEEN_TIME, -- 時間Enum.EasingStyle.Quad, -- 緩和風格Enum.EasingDirection.Out -- 緩和方向)local function buttonPress()-- 如果按鈕正在轉移,防止它再次使用if inTween == true thenreturnend-- 計算按鈕位置的新 CFramelocal 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 *= -1end)endclickDetector.MouseClick:Connect(buttonPress)進行遊戲測試並點擊對象。在測試時,您可能會注意到物件移動錯誤的方向或距離。這可以在下一個部分進行自訂。


調整移動補間動畫
添加了腳本後,您可以自定義它以符合遊戲的需求。按鈕可以在向前、向返回、向上或向下的方向移動。
變更位置
記住,青少年從起始值轉換為目標值。這個腳本使用 CFrames 將按鈕移動到相對於其當前位置的方向。該方向在 腳指令碼第 28 行 中被控制。
在那條線上,使用 X、Y 和 Z 坐標創建了新的 CFrame。在這個例子中,按鈕相對於其 Y 軸移動。
-- 計算按鈕位置的新 CFramelocal offsetCFrame = CFrame.new(0, TWEEN_MOVE_DISTANCE * buttonState, 0)local newCFrame = button.CFrame:ToWorldSpace(offsetCFrame)
若要按鈕以不同的 方向移動 ,只需將所需的坐標之一替換為線:TWEEN_MOVE_DISTANCE * buttonState。將所有其他坐標設為 0。
例如,這行會將它移至其 X 軸相對位置。
-- 計算按鈕位置的新 CFramelocal 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進行工作,我們建議以追蹤中內容:
使用特殊網格而不是網格零件。這是因為網格零件的紋理覆蓋了由腳指令碼調色的顏色。
將腳本變更為修改特殊網格的 vertexColor 而不是顏色屬性。
項目樣本
查看此非複製鎖定空間中的所有腳本範例。獲得所有腳本以進行修改。