UI 動畫/補間

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

在動畫中,補間是生成序列中兩個關鍵點之間的中間幀的過程。在設計用戶界面時,您可以使用補間將 GuiObject 從一個狀態平滑過渡到另一個狀態,例如:

  • 當用戶選擇按鈕時,平滑地增加按鈕的大小。
  • 從螢幕邊緣滑入和滑出 UI 菜單。
  • 當用戶獲得健康增益時,逐漸在兩個寬度之間動畫化健康條。

單屬性補間

位置

要補間 GuiObject位置

  1. 設定物件的 AnchorPoint
  2. 確定物件目標位置的 UDim2 坐標,使用 UDim2比例參數,而不是確切的像素值,以便物件補間到螢幕的確切中心。
  3. TweenInfo 和目標位置傳遞給 TweenService:Create()
  4. 使用 Tween:Play() 播放補間。

以下代碼片段將 ImageLabel 移動到 ScreenGui 的螢幕正中心:

UI Tween - Position
local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")
local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")
local ScreenGui = PlayerGui:WaitForChild("ScreenGui")
local object = ScreenGui:WaitForChild("ImageLabel")
object.AnchorPoint = Vector2.new(0.5, 0.5)
local targetPosition = UDim2.new(0.5, 0, 0.5, 0)
local tweenInfo = TweenInfo.new(2)
local tween = TweenService:Create(object, tweenInfo, {Position = targetPosition})
tween:Play()

大小

要補間 GuiObject大小

  1. 確定物件目標大小的 UDim2 坐標,使用 UDim2比例參數,而不是確切的像素值,以便物件補間到螢幕大小的相對百分比。
  2. UIAspectRatioConstraint 附加到物件,以在補間時保持其設計的長寬比。
  3. TweenInfo 和目標大小傳遞給 TweenService:Create()
  4. 使用 Tween:Play() 播放補間。

以下代碼片段將 ImageLabelScreenGui 中縮放到螢幕寬度或高度的 40%(以較小者為準),從物件的中心錨點開始:

UI Tween - Size
local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")
local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")
local ScreenGui = PlayerGui:WaitForChild("ScreenGui")
local object = ScreenGui:WaitForChild("ImageLabel")
object.AnchorPoint = Vector2.new(0.5, 0.5)
local aspectRatioConstraint = Instance.new("UIAspectRatioConstraint")
aspectRatioConstraint.Parent = object
local targetSize = UDim2.new(0.4, 0, 0.4, 0)
local tweenInfo = TweenInfo.new(2)
local tween = TweenService:Create(object, tweenInfo, {Size = targetSize})
tween:Play()

旋轉

要補間 GuiObject旋轉

  1. 設定物件的 AnchorPoint 以便進行旋轉。
  2. 確定物件的目標 Rotation
  3. TweenInfo 和目標旋轉傳遞給 TweenService:Create()
  4. 使用 Tween:Play() 播放補間。
UI Tween - Size
local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")
local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")
local ScreenGui = PlayerGui:WaitForChild("ScreenGui")
local object = ScreenGui:WaitForChild("ImageLabel")
object.AnchorPoint = Vector2.new(0.5, 0.5)
local targetRotation = 45
local tweenInfo = TweenInfo.new(2)
local tween = TweenService:Create(object, tweenInfo, {Rotation = targetRotation})
tween:Play()

透明度

多個屬性控制 UI 透明度,具體取決於物件類型。您可以單獨或通過 多屬性補間 補間每個屬性。或者,您可以通過將物件放入 CanvasGroup 中並補間該組的 GroupTransparency 來補間物件的整體透明度。

UI Tween - Image Transparency
local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")
local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")
local ScreenGui = PlayerGui:WaitForChild("ScreenGui")
local object = ScreenGui:WaitForChild("ImageLabel")
local targetTransparency = 0.8
local tweenInfo = TweenInfo.new(2)
local tween = TweenService:Create(object, tweenInfo, {ImageTransparency = targetTransparency})
tween:Play()
UI Tween - Canvas Group Transparency
local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")
local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")
local ScreenGui = PlayerGui:WaitForChild("ScreenGui")
local canvasGroup = ScreenGui:WaitForChild("CanvasGroup")
local targetTransparency = 0.8
local tweenInfo = TweenInfo.new(2)
local tween = TweenService:Create(canvasGroup, tweenInfo, {GroupTransparency = targetTransparency})
tween:Play()

顏色

多個屬性控制 UI 顏色,具體取決於物件類型。您可以單獨或通過 多屬性補間 補間每個屬性。或者,您可以通過將物件放入 CanvasGroup 中並補間該組的 GroupColor3 來補間物件的整體顏色。

UI Tween - Image Color
local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")
local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")
local ScreenGui = PlayerGui:WaitForChild("ScreenGui")
local object = ScreenGui:WaitForChild("ImageLabel")
local targetColor = Color3.fromRGB(255, 0, 0)
local tweenInfo = TweenInfo.new(2)
local tween = TweenService:Create(object, tweenInfo, {ImageColor3 = targetColor})
tween:Play()
UI Tween - Canvas Group Color
local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")
local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")
local ScreenGui = PlayerGui:WaitForChild("ScreenGui")
local canvasGroup = ScreenGui:WaitForChild("CanvasGroup")
local targetColor = Color3.fromRGB(255, 0, 0)
local tweenInfo = TweenInfo.new(2)
local tween = TweenService:Create(canvasGroup, tweenInfo, {GroupColor3 = targetColor})
tween:Play()

描邊

多個屬性控制 UI 邊框,具體取決於物件類型。

另外,您可以應用 UIStroke 子物件並補間其厚度、顏色和/或透明度。

UI Tween - UIStroke Color & Thickness
local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")
local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")
local ScreenGui = PlayerGui:WaitForChild("ScreenGui")
local object = ScreenGui:WaitForChild("TextLabel")
local stroke = Instance.new("UIStroke")
stroke.Color = Color3.fromRGB(255, 255, 255)
stroke.Thickness = 5
stroke.Parent = object
local targetColor = Color3.fromRGB(255, 0, 0)
local targetThickness = 10
local tweenInfo = TweenInfo.new(2)
local tween = TweenService:Create(stroke, tweenInfo, {Color = targetColor, Thickness = targetThickness})
tween:Play()

多屬性補間

您可以通過將多個目標屬性傳遞給 TweenService:Create() 將任何 單屬性補間 組合成更複雜的補間,例如 位置 + 旋轉大小 + 透明度

UI Tween - Position & Rotation
local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")
local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")
local ScreenGui = PlayerGui:WaitForChild("ScreenGui")
local object = ScreenGui:WaitForChild("ImageLabel")
object.AnchorPoint = Vector2.new(0.5, 0.5)
local targetPosition = UDim2.new(0.5, 0, 0.5, 0)
local targetRotation = 45
local tweenInfo = TweenInfo.new(2)
local tween = TweenService:Create(object, tweenInfo, {Position = targetPosition, Rotation = targetRotation})
tween:Play()
UI Tween - Size & Transparency
local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")
local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")
local ScreenGui = PlayerGui:WaitForChild("ScreenGui")
local object = ScreenGui:WaitForChild("ImageLabel")
object.AnchorPoint = Vector2.new(0.5, 0.5)
local aspectRatioConstraint = Instance.new("UIAspectRatioConstraint")
aspectRatioConstraint.Parent = object
local targetSize = UDim2.new(0.4, 0, 0.4, 0)
local targetTransparency = 0.8
local tweenInfo = TweenInfo.new(2)
local tween = TweenService:Create(object, tweenInfo, {Size = targetSize, ImageTransparency = targetTransparency})
tween:Play()

補間序列

您可以鏈接 UI 動畫,使其一個接一個地發生,通過在前一個補間的 Completed 事件上播放後續補間。例如,以下腳本將物件移動到螢幕中心,然後將其旋轉 45°。

UI Tween Sequence
local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")
local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")
local ScreenGui = PlayerGui:WaitForChild("ScreenGui")
local object = ScreenGui:WaitForChild("ImageLabel")
object.AnchorPoint = Vector2.new(0.5, 0.5)
local targetPosition = UDim2.new(0.5, 0, 0.5, 0)
local targetRotation = 45
local tweenInfo = TweenInfo.new(2)
local positionTween = TweenService:Create(object, tweenInfo, {Position = targetPosition})
local rotationTween = TweenService:Create(object, tweenInfo, {Rotation = targetRotation})
-- 最初播放位置補間
positionTween:Play()
-- 在位置補間完成後播放旋轉補間
positionTween.Completed:Connect(function()
rotationTween:Play()
end)

樣式過渡

UI 物件也可以通過 樣式過渡 動畫化,這類似於 CSS 過渡,其中一個或多個 UI 屬性通過 StyleRule 定義進行補間。詳細信息請參見 樣式編輯器 指南。

樣式編輯器中的最終樣式狀態規則。

緩動選項

使用 TweenInfo 的緩動選項,您可以控制 UI 動畫的緩動 樣式方向

樣式

Enum.EasingStyle 設定從開始到結束的插值速率。默認情況下,緩動樣式設置為 Enum.EasingStyle.Quad

樣式描述
線性以恆定速度移動。
正弦速度由正弦波決定,形成柔和的緩動運動。
二次類似於 正弦,但基於二次插值的曲線稍微更陡。
三次類似於 二次,但基於三次插值的曲線稍微更陡。
四次類似於 三次,但基於四次插值的曲線更陡。
五次類似於 四次,但基於五次插值的曲線更陡。
指數基於指數插值的最陡曲線。
圓形遵循圓弧,使加速更突然,減速更平緩,相較於 五次指數
回彈稍微超過目標,然後回到原位。
彈跳在達到目標後向後彈跳多次,然後最終穩定下來。
彈性像是附著在橡皮筋上,超過目標幾次。
帶有 'In' 緩動方向的緩動樣式變化圖。
Easing Style - Cubic
local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic)
local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})

方向

Enum.EasingDirection 定義 緩動樣式 插值如何應用於物件,默認為 Out。請注意,使用 線性 緩動樣式的補間不受影響,因為線性插值從開始到結束是恆定的。

方向描述
In緩動樣式向前應用。
Out緩動樣式向後應用。
InOut緩動樣式在前半段向前應用,後半段向後應用。
Easing direction - InOut
local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic, Enum.EasingDirection.InOut)
local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})

打字機效果

您可以輕鬆增強基於文本的 UI,例如過場橫幅、玩家指示和提示,使用動畫效果。 "打字機" 效果非常適合 TextLabels,用於講述故事、輸出 NPC 對話等。

  1. ReplicatedStorage 中創建一個新的 ModuleScript

  2. 將新腳本重命名為 AnimateUI

  3. 將以下代碼粘貼到腳本中:

    ModuleScript - AnimateUI
    local LocalizationService = game:GetService("LocalizationService")
    local Players = game:GetService("Players")
    local SOURCE_LOCALE = "en"
    local translator = nil
    local AnimateUI = {}
    function AnimateUI.loadTranslator()
    pcall(function()
    translator = LocalizationService:GetTranslatorForPlayerAsync(Players.LocalPlayer)
    end)
    if not translator then
    pcall(function()
    translator = LocalizationService:GetTranslatorForLocaleAsync(SOURCE_LOCALE)
    end)
    end
    end
    function AnimateUI.typeWrite(guiObject, text, delayBetweenChars)
    guiObject.Visible = true
    guiObject.AutoLocalize = false
    local displayText = text
    -- 如果可能,翻譯文本
    if translator then
    displayText = translator:Translate(guiObject, text)
    end
    -- 替換換行標籤,以便字形循環不會錯過這些字符
    displayText = displayText:gsub("<br%s*/>", "\n")
    -- 移除 RichText 標籤,因為逐字動畫會破壞標籤
    displayText = displayText:gsub("<[^<>]->", "")
    -- 在父物件上設置翻譯/修改後的文本
    guiObject.Text = displayText
    local index = 0
    for first, last in utf8.graphemes(displayText) do
    index += 1
    guiObject.MaxVisibleGraphemes = index
    task.wait(delayBetweenChars)
    end
    end
    return AnimateUI
  4. 在合適的位置創建一個 TextLabel,例如在 ScreenGui 中作為父物件。

  5. 插入一個新的 LocalScript 作為標籤的直接子物件,並粘貼以下代碼。請注意,每條消息都是通過調用 AnimateUI.typeWrite() 並傳遞父物件、要輸出的字符串和字符之間的延遲來輸出的。

    LocalScript
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local AnimateUI = require(ReplicatedStorage:WaitForChild("AnimateUI"))
    local label = script.Parent
    -- 如果遊戲已本地化,則加載翻譯器
    --AnimateUI.loadTranslator()
    local message1 = [[這扇門後面是<br /><font size="46" color="rgb(255,50,25)">偉大的佐戈斯...</font> <font size="40">🗡</font>]]
    AnimateUI.typeWrite(label, message1, 0.05)
    task.wait(1)
    local message2 = [[...誰在這個地牢中 <font color="rgb(255,200,50)">無人挑戰地統治!</font> <font size="30">😈</font>]]
    AnimateUI.typeWrite(label, message2, 0.05)
©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。