W animacji, tweening to proces generowania pośrednich klatek między dwoma punktami kluczowymi w sekwencji. Projektując interfejs użytkownika, możesz użyć tweeningu, aby płynnie przejść 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 między dwoma szerokościami, gdy użytkownik otrzymuje bonus do zdrowia.
Tweeny pojedynczej właściwości
Pozycja
Aby tweenować pozycję 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 ScreenGui do dokładnego środka ekranu:
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()Rozmiar
Aby tweenować rozmiar GuiObject:
- Dołącz UIAspectRatioConstraint do obiektu, aby zachować jego zaprojektowany współczynnik proporcji podczas tweeningu.
- Przekaż TweenInfo i docelowy rozmiar do TweenService:Create().
- Odtwórz tween za pomocą Tween:Play().
Poniższy fragment kodu skaluje ImageLabel w ScreenGui do 40% szerokości lub wysokości ekranu (cokolwiek jest mniejsze) z punktu kotwiczenia obiektu:
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()Rotacja
Aby tweenować rotację GuiObject:
- Ustaw AnchorPoint dla obiektu, wokół którego ma się obracać.
- Określ docelową Rotation dla obiektu.
- Przekaż TweenInfo i docelową rotację do TweenService:Create().
- Odtwórz tween za pomocą Tween:Play().
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()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 indywidualnie lub w połączeniu przez tween wielowłaściwościowy. Alternatywnie, możesz tweenować ogólną przezroczystość obiektu, umieszczając go w CanvasGroup i tweenując GroupTransparency grupy.
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()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()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 indywidualnie lub w połączeniu przez tween wielowłaściwościowy. Alternatywnie, możesz tweenować ogólny kolor obiektu, umieszczając go w CanvasGroup i tweenując GroupColor3 grupy.
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()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()Kontur
Wiele właściwości kontroluje krawędzie UI, w zależności od typu obiektu.
Alternatywnie, możesz zastosować dziecko UIStroke i tweenować jego grubość, kolor i/lub przezroczystość.
| Obiekt UI | Właściwości |
|---|---|
| UIStroke | Color, Thickness, 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("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()Tweeny wielowłaściwościowe
Możesz połączyć dowolne z tweenów pojedynczej właściwości w bardziej złożone tweens, przekazując wiele docelowych właściwości do TweenService:Create(), na przykład pozycja + rotacja lub 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 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()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()Sekwencje tweenów
Możesz łączyć animacje UI, aby następowały jedna po drugiej, odtwarzając kolejne tweens po zdarzeniu Completed poprzedniego tweenu. Na przykład, poniższy skrypt przesuwa obiekt do środka ekranu, a następnie obraca go o 45°.
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()
-- Odtwórz tween rotacji po zakończeniu tweenu 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 tweenowana przez definicje StyleRule. Zobacz przewodnik Edytor stylów dla szczegółów.

Opcje łagodzenia
Używając opcji łagodzenia TweenInfo, możesz kontrolować styl i kierunek łagodzenia 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ą. |
| Sinusoidalny | Prędkość jest określana przez falę sinusoidalną dla łagodnego ruchu łagodzenia. |
| Kwadratowy | Podobny do Sinusoidalnego, ale z nieco ostrzejszą krzywą opartą na interpolacji kwadratowej. |
| Sześcienny | Podobny do Kwadratowego, ale z nieco ostrzejszą krzywą opartą na interpolacji sześciennej. |
| Czwórkowy | Podobny do Sześciennego, ale z jeszcze ostrzejszą krzywą opartą na interpolacji czwórkowej. |
| Piąty | Podobny do Czwórkowego, ale z jeszcze ostrzejszą krzywą opartą na interpolacji piątej. |
| Eksponencjalny | Najostrzejsza krzywa oparta na interpolacji eksponencjalnej. |
| Okrągły | Podąża za okrągłym łukiem, tak że przyspieszenie jest bardziej nagłe, a spowolnienie bardziej stopniowe w porównaniu do Piątego lub Eksponencjalnego. |
| Powrót | Nieco przekracza cel, a następnie wraca na miejsce. |
| Odbicie | Odbija się wstecz wielokrotnie po osiągnięciu celu, zanim ostatecznie się ustabilizuje. |
| Elastyczny | Porusza się, jakby był przymocowany do gumki, przekraczając cel kilka razy. |

local 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ślnym ustawieniem Out. Zauważ, że tween z Liniowym stylem łagodzenia 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 odwrotnym. |
| InOut | Styl łagodzenia stosuje się do przodu w pierwszej połowie, a w odwrotnym kierunku w drugiej połowie. |
local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic, Enum.EasingDirection.InOut)
local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})Efekt maszyny do pisania na tekście
Możesz łatwo wzbogacić interfejs użytkownika oparty na tekście, taki jak banery w cutscenach, instrukcje dla graczy i komunikaty, o animowane efekty. Efekt "maszyny do pisania" jest idealny dla TextLabels, które opowiadają historię, wyświetlają rozmowy NPC itp.
Utwó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-- Przetłumacz tekst, jeśli to możliweif translator thendisplayText = translator:Translate(guiObject, text)end-- Zastąp tagi łamania linii, aby pętla graphemów nie pominęła tych znakówdisplayText = displayText:gsub("<br%s*/>", "\n")-- Usuń tagi RichText, ponieważ animacja znak po znaku zepsuje tagidisplayText = displayText:gsub("<[^<>]->", "")-- Ustaw przetłumaczony/zmodyfikowany tekst na rodzicuguiObject.Text = displayTextlocal index = 0for first, last in utf8.graphemes(displayText) doindex += 1guiObject.MaxVisibleGraphemes = indextask.wait(delayBetweenChars)endendreturn AnimateUIUtwórz TextLabel w odpowiedniej lokalizacji, na przykład w ScreenGui będącym rodzicem StarterGui.
Wstaw nowy LocalScript jako bezpośrednie dziecko etykiety i wklej poniższy kod. Zauważ, że każda wiadomość jest wyświetlana, wywołując AnimateUI.typeWrite() z parametrami dla obiektu rodzica, ciągu 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 tłumacza, jeśli gra jest zlokalizowana--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)