In animatie is tweening het proces van het genereren van tussenliggende frames tussen twee sleutelpunten in een reeks. Bij het ontwerpen van een gebruikersinterface kun je tweening gebruiken om een GuiObject soepel van de ene staat naar de andere over te brengen, zoals:
- Het soepel vergroten van de grootte van een knop wanneer een gebruiker deze selecteert.
- UI-menu's in en uit de schermranden schuiven.
- Een gezondheidsbalk geleidelijk animeren tussen twee breedtes wanneer een gebruiker een gezondheidsboost ontvangt.
Enkelvoudige property tweens
Positie
Om de positie van een GuiObject te tweenen:
- Stel het AnchorPoint voor het object in.
- Geef een TweenInfo en de doelpositie door aan TweenService:Create().
- Speel de tween af met Tween:Play().
De volgende codefragment verplaatst een ImageLabel binnen een ScreenGui naar het exacte midden van het scherm:
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()Grootte
Om de grootte van een GuiObject te tweenen:
- Bevestig een UIAspectRatioConstraint aan het object om de ontworpen aspectverhouding te behouden tijdens het tweenen.
- Geef een TweenInfo en de doelgrootte door aan TweenService:Create().
- Speel de tween af met Tween:Play().
De volgende codefragment schaalt een ImageLabel binnen een ScreenGui naar 40% van de schermbreedte of -hoogte (wat het kleinste is) vanaf het middelpunt van het object:
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()Rotatie
Om de rotatie van een GuiObject te tweenen:
- Stel het AnchorPoint voor het object in om rond te draaien.
- Bepaal de doel Rotation voor het object.
- Geef een TweenInfo en de doelrotatie door aan TweenService:Create().
- Speel de tween af met 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()Transparantie
Meerdere eigenschappen regelen de UI-transparantie, afhankelijk van het type object. Je kunt elk van deze eigenschappen afzonderlijk tweenen of gecombineerd via een multi-property tween. Alternatief kun je de algehele transparantie van een object tweenen door het in een CanvasGroup te plaatsen en de GroupTransparency van de groep te tweenen.
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()Kleur
Meerdere eigenschappen regelen de UI-kleur, afhankelijk van het type object. Je kunt elk van deze eigenschappen afzonderlijk tweenen of gecombineerd via een multi-property tween. Alternatief kun je de algehele kleur van een object tweenen door het in een CanvasGroup te plaatsen en de GroupColor3 van de groep te tweenen.
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()Stroke
Meerdere eigenschappen regelen de UI-randen, afhankelijk van het type object.
Alternatief kun je een UIStroke kind toepassen en de dikte, kleur en/of transparantie tweenen.
| UI-object | Eigenschappen |
|---|---|
| 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()Multi-property tweens
Je kunt elke van de enkelvoudige property tweens combineren in complexere tweens door meerdere doel-eigenschappen door te geven aan TweenService:Create(), bijvoorbeeld positie + rotatie of grootte + transparantie.
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()Tween-sequenties
Je kunt UI-animaties aan elkaar koppelen zodat ze één voor één plaatsvinden door opeenvolgende tweens af te spelen bij het Completed evenement van de vorige tween. Bijvoorbeeld, het volgende script verplaatst een object naar het midden van het scherm en roteert het vervolgens met 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})
-- Speel aanvankelijk de positie tween af
positionTween:Play()
-- Speel de rotatie tween af na voltooiing van de positie tween
positionTween.Completed:Connect(function()
rotationTween:Play()
end)Stijlovergangen
UI-objecten kunnen ook worden geanimeerd via stijlovergangen, vergelijkbaar met CSS-overgangen, waarbij een of meer UI-eigenschappen worden tweened via StyleRule definities. Zie de Stijl Editor gids voor details.

Easing-opties
Met de easing-opties van TweenInfo kun je de easing stijl en richting van UI-animaties regelen.
Stijl
Enum.EasingStyle stelt de snelheid van interpolatie van begin tot eind in. Standaard is de easingstijl ingesteld op Enum.EasingStyle.Quad.
| Stijl | Beschrijving |
|---|---|
| Lineair | Beweegt met een constante snelheid. |
| Sinus | Snelheid wordt bepaald door een sinusgolf voor een zachte easingbeweging. |
| Quad | Vergelijkbaar met Sinus maar met een iets scherpere curve op basis van kwadratische interpolatie. |
| Cubic | Vergelijkbaar met Quad maar met een iets scherpere curve op basis van kubieke interpolatie. |
| Quart | Vergelijkbaar met Cubic maar met een nog scherpere curve op basis van quartische interpolatie. |
| Quint | Vergelijkbaar met Quart maar met een nog scherpere curve op basis van quintische interpolatie. |
| Exponential | De scherpste curve op basis van exponentiële interpolatie. |
| Cirkelvormig | Volgt een cirkelboog, zodat versnelling plotselinger is en vertraging geleidelijker in vergelijking met Quint of Exponential. |
| Terug | Overschrijdt iets het doel, en komt dan terug op zijn plaats. |
| Stuiter | Stuitert meerdere keren achteruit na het bereiken van het doel, voordat het uiteindelijk tot rust komt. |
| Elastisch | Beweegt alsof het aan een rubberen band is bevestigd, overschrijdt het doel meerdere keren. |

local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic)
local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})Richting
Enum.EasingDirection definieert hoe de easingstijl interpolatie op een object wordt toegepast, met een standaard van Out. Merk op dat een tween met Lineaire easingstijl niet wordt beïnvloed, aangezien lineaire interpolatie constant is van begin tot eind.
| Richting | Beschrijving |
|---|---|
| In | De easingstijl wordt in een voorwaartse richting toegepast. |
| Out | De easingstijl wordt in een omgekeerde richting toegepast. |
| InOut | De easingstijl wordt voorwaarts toegepast voor de eerste helft en in omgekeerde richting voor de tweede helft. |
local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic, Enum.EasingDirection.InOut)
local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})Typewriter-effect op tekst
Je kunt tekstgebaseerde UI, zoals cutscene-banners, spelersinstructies en prompts, eenvoudig verbeteren met geanimeerde effecten. Het "typewriter"-effect is ideaal voor TextLabels die een verhaal vertellen, NPC-gesprekken weergeven, enz.
Maak een nieuwe ModuleScript binnen ReplicatedStorage.
Hernoem het nieuwe script naar AnimateUI.

Plak de volgende code in het script:
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-- Vertaal tekst indien mogelijkif translator thendisplayText = translator:Translate(guiObject, text)end-- Vervang regelafbrekingstags zodat de grapheloop deze tekens niet mistdisplayText = displayText:gsub("<br%s*/>", "\n")-- Verwijder RichText-tags omdat animatie per teken de tags zou brekendisplayText = displayText:gsub("<[^<>]->", "")-- Stel de vertaalde/aangepaste tekst in op de ouderguiObject.Text = displayTextlocal index = 0for first, last in utf8.graphemes(displayText) doindex += 1guiObject.MaxVisibleGraphemes = indextask.wait(delayBetweenChars)endendreturn AnimateUIMaak een TextLabel op een geschikte locatie, zoals binnen een ScreenGui die is gekoppeld aan StarterGui.
Voeg een nieuwe LocalScript toe als directe kind van het label en plak de volgende code erin. Merk op dat elk bericht wordt weergegeven door AnimateUI.typeWrite() aan te roepen met parameters voor het ouderobject, de string die moet worden weergegeven en de vertraging tussen de tekens.
LocalScriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local AnimateUI = require(ReplicatedStorage:WaitForChild("AnimateUI"))local label = script.Parent-- Laad vertaler als het spel gelokaliseerd is--AnimateUI.loadTranslator()local message1 = [[Achter deze deur is de<br /><font size="46" color="rgb(255,50,25)">Grote Zorgoth...</font> <font size="40">🗡</font>]]AnimateUI.typeWrite(label, message1, 0.05)task.wait(1)local message2 = [[...die deze kerker <font color="rgb(255,200,50)">onbetwist heerst!</font> <font size="30">😈</font>]]AnimateUI.typeWrite(label, message2, 0.05)