W animacji, tweening to proces generowania pośrednich klatek pomiędzy dwoma punktami kluczowymi w sekwencji. Projektując interfejs użytkownika, możesz użyć tweeningu do płynnego przejścia obiektu GuiObject z jednego stanu do drugiego, na przykład:
- Płynne zwiększanie rozmiaru przycisku, gdy użytkownik go wybiera.
- Przesuwanie menu UI w i z krawędzi ekranu.
- Stopniowe animowanie paska zdrowia pomiędzy dwoma szerokościami, gdy użytkownik otrzymuje bonus do zdrowia.
Tweens pojedynczej właściwości
Pozycja
Aby tweenować pozycję obiektu GuiObject:
- Ustaw AnchorPoint dla obiektu.
- Przekaż TweenInfo i docelową pozycję do TweenService:Create().
- Odtwórz tween za pomocą Tween:Play().
Poniższy fragment kodu przesuwa ImageLabel w obrębie ScreenGui do dokładnego środka ekranu:
UI Tween - Pozycjalocal 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()
Rozmiar
Aby tweenować rozmiar obiektu GuiObject:
- Dołącz UIAspectRatioConstraint do obiektu, aby utrzymać zaprojektowany proporcje podczas tweeningu.
- Przekaż TweenInfo i docelowy rozmiar do TweenService:Create().
- Odtwórz tween za pomocą Tween:Play().
Poniższy fragment kodu skalowania ImageLabel w obrębie ScreenGui do 40% szerokości lub wysokości ekranu (cokolwiek jest mniejsze) z centralnego punktu kotwicy obiektu:
UI Tween - Rozmiarlocal 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 = objectlocal targetSize = UDim2.new(0.4, 0, 0.4, 0)local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(object, tweenInfo, {Size = targetSize})tween:Play()
Rotacja
Aby tweenować rotację obiektu GuiObject:
- Ustaw AnchorPoint dla obiektu, wokół którego ma się rotować.
- Określ docelową Rotation dla obiektu.
- Przekaż TweenInfo i docelową rotację do TweenService:Create().
- Odtwórz tween za pomocą Tween:Play().
UI Tween - Rozmiarlocal 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 = 45local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(object, tweenInfo, {Rotation = targetRotation})tween:Play()
Przezroczystość
Wiele właściwości kontroluje przezroczystość UI, w zależności od typu obiektu. Możesz tweenować każdą z tych właściwości osobno lub w połączeniu poprzez tween wielu właściwości. Alternatywnie, możesz tweenować ogólną przezroczystość obiektu, umieszczając go w CanvasGroup i tweenując GroupTransparency grupy.
UI Tween - Przezroczystość obrazulocal 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.8local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(object, tweenInfo, {ImageTransparency = targetTransparency})tween:Play()
UI Tween - Przezroczystość grupy Canvaslocal 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.8local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(canvasGroup, tweenInfo, {GroupTransparency = targetTransparency})tween:Play()
Kolor
Wiele właściwości kontroluje kolor UI, w zależności od typu obiektu. Możesz tweenować każdą z tych właściwości osobno lub w połączeniu przez tween wielu właściwości. Alternatywnie, możesz tweenować ogólny kolor obiektu, umieszczając go w CanvasGroup i tweenując GroupColor3.
UI Tween - Kolor obrazulocal 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 - Kolor grupy Canvaslocal 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()
Obrys
Wiele właściwości kontroluje obramowania UI, w zależności od typu obiektu.
Alternatywnie, możesz zastosować obiekt UIStroke i tweenować jego grubość, kolor i/lub przezroczystość.
| Obiekt UI | Właściwości |
|---|---|
| UIStroke | Color, Thickness, Transparency |
UI Tween - Kolor i grubość UIStrokelocal 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 = 5stroke.Parent = objectlocal targetColor = Color3.fromRGB(255, 0, 0)local targetThickness = 10local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(stroke, tweenInfo, {Color = targetColor, Thickness = targetThickness})tween:Play()
Tweens wielu właściwości
Możesz połączyć dowolne z tweens pojedynczej właściwości w bardziej złożone tweens, przekazując wiele docelowych właściwości do TweenService:Create(), przykładowo pozycja + rotacja lub rozmiar + przezroczystość.
UI Tween - Pozycja & Rotacjalocal 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 = 45local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(object, tweenInfo, {Position = targetPosition, Rotation = targetRotation})tween:Play()
UI Tween - Rozmiar & Przezroczystość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 = objectlocal targetSize = UDim2.new(0.4, 0, 0.4, 0)local targetTransparency = 0.8local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(object, tweenInfo, {Size = targetSize, ImageTransparency = targetTransparency})tween:Play()
Sekwencje tweenów
Możesz połączyć animacje UI tak, aby następowały jedna po drugiej, odtwarzając kolejne tweens po zakończeniu Completed poprzedniego tweenu. Na przykład, poniższy skrypt przesuwa obiekt do środka ekranu, a następnie obraca go o 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})
-- Początkowo odtwórz tween pozycji
positionTween:Play()
-- Odtwarzaj tween rotacji po zakończeniu tweena pozycji
positionTween.Completed:Connect(function()
rotationTween:Play()
end)
Przejścia stylów
Obiekty UI mogą być również animowane za pomocą przejść stylów, porównywalnych do przejść CSS, gdzie jedna lub więcej właściwości UI jest tweenowanych poprzez definicje StyleRule. Zobacz przewodnik po Edytorze stylów dla szczegółów.

Opcje łagodzenia
Używając opcji łagodzenia TweenInfo, możesz kontrolować styl łagodzenia i kierunek animacji UI.
Styl
Enum.EasingStyle ustawia tempo interpolacji od początku do końca. Domyślnie styl łagodzenia jest ustawiony na Enum.EasingStyle.Quad.
| Styl | Opis |
|---|---|
| Liniowy | Porusza się z stałą prędkością. |
| Sine | Prędkość jest określona przez falę sinusoidalną dla łagodnego ruchu łagodzenia. |
| Quad | Podobny do Sine, ale z nieco ostrzejszą krzywą opartą na interpolacji kwadratowej. |
| Cubic | Podobny do Quad, ale z nieco ostrzejszą krzywą opartą na interpolacji sześciennej. |
| Quart | Podobny do Cubic, ale z jeszcze ostrzejszą krzywą opartą na interpolacji czwartej. |
| Quint | Podobny do Quart, ale z jeszcze ostrzejszą krzywą opartą na interpolacji piątej. |
| Exponential | Najostrzejsza krzywa oparta na interpolacji eksponencjalnej. |
| Circular | Podąża za łukiem okręgu, tak że przyspieszenie jest bardziej nagłe, a de facto wolniejsze w porównaniu do Quint lub Exponential. |
| Back | Nieco przekracza cel, a następnie wraca na miejsce. |
| Bounce | Skacze do tyłu wielokrotnie po osiągnięciu celu, zanim w końcu się ustabilizuje. |
| Elastic | Porusza się tak, jakby był przyczepiony do gumki, wielokrotnie przekraczając cel. |

Styl łagodzenia - Cubiclocal tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic)local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})
Kierunek
Enum.EasingDirection definiuje, jak interpolacja stylu łagodzenia stosuje się do obiektu, z domyślną wartością Out. Zauważ, że tween ze stylem łagodzenia Liniowy nie jest dotknięty, ponieważ interpolacja liniowa jest stała od początku do końca.
| Kierunek | Opis |
|---|---|
| In | Styl łagodzenia stosuje się w kierunku do przodu. |
| Out | Styl łagodzenia stosuje się w kierunku wstecznym. |
| InOut | Styl łagodzenia stosuje się w kierunku do przodu w pierwszej połowie, a w kierunku wstecznym w drugiej połowie. |
Kierunek łagodzenia - InOutlocal tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic, Enum.EasingDirection.InOut)local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})
Efekt maszyny do pisania w tekście
Możesz łatwo wzbogacić tekstowe UI, takie jak banery cutscen, instrukcje dla graczy i monity, o efekty animowane. Efekt "maszyny do pisania" jest idealny dla TextLabels, które opowiadają historię, wyświetlają rozmowy NPC itd.
Stwórz nowy ModuleScript w ReplicatedStorage.
Zmień nazwę nowego skryptu na AnimateUI.

Wklej poniższy kod do skryptu:
ModuleScript - AnimateUIlocal LocalizationService = game:GetService("LocalizationService")local Players = game:GetService("Players")local SOURCE_LOCALE = "en"local translator = nillocal AnimateUI = {}function AnimateUI.loadTranslator()pcall(function()translator = LocalizationService:GetTranslatorForPlayerAsync(Players.LocalPlayer)end)if not translator thenpcall(function()translator = LocalizationService:GetTranslatorForLocaleAsync(SOURCE_LOCALE)end)endendfunction AnimateUI.typeWrite(guiObject, text, delayBetweenChars)guiObject.Visible = trueguiObject.AutoLocalize = falselocal displayText = text-- Tłumaczenie tekstu, jeśli to możliweif translator thendisplayText = translator:Translate(guiObject, text)end-- Zastąp znaczniki złamań wierszy, aby pętla grafemów nie pominęła tych znakówdisplayText = displayText:gsub("<br%s*/>", "\n")-- Usuń znaczniki RichText, ponieważ animacja znak po znaku zepsuje znacznikidisplayText = displayText:gsub("<[^<>]->", "")-- Ustaw tłumaczony/modyfikowany tekst na rodzicuguiObject.Text = displayTextlocal index = 0for first, last in utf8.graphemes(displayText) doindex += 1guiObject.MaxVisibleGraphemes = indextask.wait(delayBetweenChars)endendreturn AnimateUIStwórz TextLabel w odpowiedniej lokalizacji, na przykład w ramach ScreenGui, powiązanej z StarterGui.
Wstaw nowy LocalScript jako bezpośrednie dziecko etykiety i wklej do niego poniższy kod. Zauważ, że każda wiadomość jest wyświetlana przez wywołanie AnimateUI.typeWrite() z parametrami dla obiektu rodzica, łańcucha do wyświetlenia i opóźnienia między znakami.
LocalScriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local AnimateUI = require(ReplicatedStorage:WaitForChild("AnimateUI"))local label = script.Parent-- Załaduj translator, jeśli doświadczenie jest lokalizowane--AnimateUI.loadTranslator()local message1 = [[Za tymi drzwiami jest<br /><font size="46" color="rgb(255,50,25)">Wielki Zorgoth...</font> <font size="40">🗡</font>]]AnimateUI.typeWrite(label, message1, 0.05)task.wait(1)local message2 = [[...który rządzi tym lochem <font color="rgb(255,200,50)">bez wyzwania!</font> <font size="30">😈</font>]]AnimateUI.typeWrite(label, message2, 0.05)