In der Animation ist Tweening der Prozess, bei dem Zwischenbilder zwischen zwei Schlüsselpositionen in einer Sequenz generiert werden. Bei der Gestaltung einer Benutzeroberfläche können Sie Tweening verwenden, um ein GuiObject sanft von einem Zustand in einen anderen zu überführen, wie zum Beispiel:
- Die Größe eines Buttons sanft zu erhöhen, wenn ein Benutzer ihn auswählt.
- UI-Menüs von den Bildschirmkanten ein- und auszuschieben.
- Eine Gesundheitsanzeige zwischen zwei Breiten allmählich zu animieren, wenn ein Benutzer einen Gesundheitsboost erhält.
Einzelne Übergänge
Position
Um die Position eines GuiObject zu tween:
- Setzen Sie den AnchorPoint für das Objekt.
- Übergeben Sie einen TweenInfo und die Zielposition an TweenService:Create().
- Spielen Sie den Tween mit Tween:Play().
Der folgende Codeausschnitt bewegt ein ImageLabel innerhalb eines ScreenGui zur genauen Mitte des Bildschirms:
UI Tween - Positionlocal 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()
Größe
Um die Größe eines GuiObject zu tween:
- Fügen Sie dem Objekt einen UIAspectRatioConstraint hinzu, um das entworfene Seitenverhältnis beim Tweening beizubehalten.
- Übergeben Sie einen TweenInfo und die Zielgröße an TweenService:Create().
- Spielen Sie den Tween mit Tween:Play().
Der folgende Codeausschnitt skaliert ein ImageLabel innerhalb eines ScreenGui auf 40% der Bildschirmbreite oder -höhe (je nachdem, was kleiner ist) vom Ankerpunkt des Objekts aus:
UI Tween - Größelocal 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()
Rotation
Um die Rotation eines GuiObject zu tween:
- Setzen Sie den AnchorPoint für das Objekt, um darum zu rotieren.
- Bestimmen Sie die Ziel Rotation für das Objekt.
- Übergeben Sie einen TweenInfo und die Zielrotation an TweenService:Create().
- Spielen Sie den Tween mit Tween:Play().
UI Tween - Größelocal 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()
Transparenz
Mehrere Eigenschaften steuern die UI-Transparenz, abhängig vom Objekttyp. Sie können jede dieser Eigenschaften einzeln oder kombiniert über einen Multi-Property Tween tween. Alternativ können Sie die gesamte Transparenz eines Objekts tween, indem Sie es in eine CanvasGroup einfügen und die GroupTransparency der Gruppe tween.
UI Tween - Bildtransparenzlocal 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 - Canvas Group Transparenzlocal 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()
Farbe
Mehrere Eigenschaften steuern die UI-Farbe, abhängig vom Objekttyp. Sie können jede dieser Eigenschaften einzeln oder kombiniert über einen Multi-Property Tween tween. Alternativ können Sie die gesamte Farbe eines Objekts tween, indem Sie es in eine CanvasGroup einfügen und die GroupColor3 der Gruppe tween.
UI Tween - Bildfarbelocal 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 Farbelocal 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
Mehrere Eigenschaften steuern die UI-Ränder, abhängig vom Objekttyp.
Alternativ können Sie ein UIStroke-Kind hinzufügen und dessen Dicke, Farbe und/oder Transparenz tween.
| UI-Objekt | Eigenschaften |
|---|---|
| UIStroke | Color, Thickness, Transparency |
UI Tween - UIStroke Farbe & Dickelocal 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()
Multi-Property Tween
Sie können beliebige Einzelübertragungen in komplexere Tweenings kombinieren, indem Sie mehrere Ziel-Eigenschaften an TweenService:Create() übergeben, zum Beispiel Position + Rotation oder Größe + Transparenz.
UI Tween - Position & Rotationlocal 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 - Größe & Transparenzlocal 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()
Tween-Sequenzen
Sie können UI-Animationen aneinanderreihen, damit sie nacheinander stattfinden, indem Sie nachfolgende Tweens beim Completed-Ereignis des vorhergehenden Tweens abspielen. Zum Beispiel bewegt das folgende Skript ein Objekt zur Mitte des Bildschirms und dreht es dann um 45°.
UI Tween Sequenz
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})
-- Zunächst den Position Tween abspielen
positionTween:Play()
-- Den Rotation Tween nach Abschluss des Position Tween abspielen
positionTween.Completed:Connect(function()
rotationTween:Play()
end)
Stilübergänge
UI-Objekte können auch durch Stilübergänge animiert werden, vergleichbar mit CSS-Übergängen, bei denen eine oder mehrere UI-Eigenschaften durch StyleRule-Definitionen Tweened werden. Siehe die Stileditor Anleitung für Details.

Easing-Optionen
Mit den Easing-Optionen von TweenInfo können Sie den Stil und Richtung der UI-Animationen steuern.
Stil
Enum.EasingStyle legt die Interpolationsrate von Anfang bis Ende fest. Standardmäßig wird der Easing-Stil auf Enum.EasingStyle.Quad gesetzt.
| Stil | Beschreibung |
|---|---|
| Linear | Bewegt sich mit konstanter Geschwindigkeit. |
| Sine | Die Geschwindigkeit wird durch eine Sinuswelle für eine sanfte Easing-Bewegung bestimmt. |
| Quad | Ähnlich wie Sine, aber mit einer etwas schärferen Kurve basierend auf quadratischer Interpolation. |
| Cubic | Ähnlich wie Quad, aber mit einer etwas schärferen Kurve basierend auf kubischer Interpolation. |
| Quart | Ähnlich wie Cubic, aber mit einer noch schärferen Kurve basierend auf quartischer Interpolation. |
| Quint | Ähnlich wie Quart, aber mit einer noch schärferen Kurve basierend auf quintischer Interpolation. |
| Exponential | Die schärfste Kurve basierend auf exponenzieller Interpolation. |
| Circular | Folgt einem kreisförmigen Bogen, sodass die Beschleunigung plötzlicher und die Verzögerung allmählicher ist im Vergleich zu Quint oder Exponential. |
| Back | Übersteigt leicht das Ziel und zieht dann zurück an seinen Platz. |
| Bounce | Springt mehrfach zurück, nachdem das Ziel erreicht wurde, bevor es schließlich zum Stillstand kommt. |
| Elastic | Bewegt sich, als wäre es an einem Gummiband befestigt, und übersteigt das Ziel mehrmals. |

Easing Style - Cubiclocal tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic)local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})
Richtung
Enum.EasingDirection definiert, wie die Easing Style Interpolation auf ein Objekt angewendet wird, wobei der Standardwert Out ist. Beachten Sie, dass ein Tween mit Linear Easing-Stil nicht betroffen ist, da die lineare Interpolation konstant von Anfang bis Ende ist.
| Richtung | Beschreibung |
|---|---|
| In | Der Easing-Stil wird vorwärts angewendet. |
| Out | Der Easing-Stil wird rückwärts angewendet. |
| InOut | Der Easing-Stil wird in der ersten Hälfte vorwärts und in der zweiten Hälfte rückwärts angewendet. |
Easing direction - InOutlocal tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic, Enum.EasingDirection.InOut)local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})
Schreibmaschinen-Effekt bei Text
Sie können die textbasierten UI-Elemente, wie Schnittszenenbanner, Spielerhinweise und Eingabeaufforderungen, ganz einfach mit animierten Effekten aufwerten. Der "Schreibmaschinen"-Effekt ist ideal für TextLabel, die eine Geschichte erzählen, NPC-Gespräche ausgeben usw.
Erstellen Sie ein neues ModuleScript innerhalb von ReplicatedStorage.
Benennen Sie das neue Skript um in AnimateUI.

Fügen Sie den folgenden Code in das Skript ein:
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-- Übersetze den Text, wenn möglichif translator thendisplayText = translator:Translate(guiObject, text)end-- Ersetze Zeilenumbruch-Tags, sodass die Graphem-Schleife diese Zeichen nicht verpasstdisplayText = displayText:gsub("<br%s*/>", "\n")-- Entferne RichText-Tags, da die Animation Zeichen für Zeichen die Tags brechen würdedisplayText = displayText:gsub("<[^<>]->", "")-- Setze den übersetzten/modifizierten Text am ElternobjektguiObject.Text = displayTextlocal index = 0for first, last in utf8.graphemes(displayText) doindex += 1guiObject.MaxVisibleGraphemes = indextask.wait(delayBetweenChars)endendreturn AnimateUIErstellen Sie ein TextLabel an einem geeigneten Ort, z.B. innerhalb eines ScreenGui, das zu StarterGui gehört.
Fügen Sie ein neues LocalScript als direktes Kind des Labels hinzu und fügen Sie folgender Code ein. Beachten Sie, dass jede Nachricht durch den Aufruf von AnimateUI.typeWrite() mit Parametern für das Elternobjekt, die anzuzeigende Zeichenfolge und die Verzögerung zwischen den Zeichen ausgegeben wird.
LocalScriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local AnimateUI = require(ReplicatedStorage:WaitForChild("AnimateUI"))local label = script.Parent-- Lade den Übersetzer, wenn die Erfahrung lokalisiert ist--AnimateUI.loadTranslator()local message1 = [[Jenseits dieser Tür ist der<br /><font size="46" color="rgb(255,50,25)">Große Zorgoth...</font> <font size="40">🗡</font>]]AnimateUI.typeWrite(label, message1, 0.05)task.wait(1)local message2 = [[...der dieses Verlies <font color="rgb(255,200,50)">unkonfrontiert beherrscht!</font> <font size="30">😈</font>]]AnimateUI.typeWrite(label, message2, 0.05)