Nell'animazione, il tweening è il processo di generare fotogrammi intermedi tra due punti chiave in una sequenza. Quando progetti un'interfaccia utente, puoi utilizzare il tweening per fare una transizione di un GuiObject in modo fluido da uno stato a un altro, come ad esempio:
- Aumentare dolcemente la dimensione di un pulsante quando un utente lo seleziona.
- Far scorrere i menu UI dentro e fuori dai bordi dello schermo.
- Animare gradualmente una barra della salute tra due larghezze quando un utente riceve un potenziamento di salute.
Tween di singole proprietà
Posizione
Per tweenare la posizione di un GuiObject:
- Imposta il AnchorPoint per l'oggetto.
- Passa un TweenInfo e la posizione obiettivo a TweenService:Create().
- Riproduci il tween con Tween:Play().
Il seguente frammento di codice sposta un ImageLabel all'interno di un ScreenGui esattamente al centro dello schermo:
UI Tween - Posizionelocal 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()
Dimensione
Per tweenare la dimensione di un GuiObject:
- Collega un UIAspectRatioConstraint all'oggetto per mantenere il suo rapporto di aspetto progettato durante il tweening.
- Passa un TweenInfo e la dimensione obiettivo a TweenService:Create().
- Riproduci il tween con Tween:Play().
Il seguente frammento di codice scala un ImageLabel all'interno di un ScreenGui al 40% della larghezza o altezza dello schermo (quella che è più piccola) dal punto di ancoraggio centrale dell'oggetto:
UI Tween - Dimensionelocal 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()
Rotazione
Per tweenare la rotazione di un GuiObject:
- Imposta il AnchorPoint per l'oggetto attorno al quale ruotare.
- Determina la rotazione obiettivo Rotation per l'oggetto.
- Passa un TweenInfo e la rotazione obiettivo a TweenService:Create().
- Riproduci il tween con Tween:Play().
UI Tween - Dimensionelocal 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()
Trasparenza
Più proprietà controllano la trasparenza dell'UI, a seconda del tipo di oggetto. Puoi tweenare ciascuna di queste proprietà individualmente o combinate tramite un tween di più proprietà. In alternativa, puoi tweenare la trasparenza complessiva di un oggetto posizionandolo all'interno di un CanvasGroup e tweenando la GroupTransparency del gruppo.
UI Tween - Trasparenza Immaginelocal 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 - Trasparenza di Canvas Grouplocal 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()
Colore
Più proprietà controllano il colore dell'UI, a seconda del tipo di oggetto. Puoi tweenare ciascuna di queste proprietà individualmente o combinate tramite un tween di più proprietà. In alternativa, puoi tweenare il colore complessivo di un oggetto posizionandolo all'interno di un CanvasGroup e tweenando il GroupColor3 del gruppo.
UI Tween - Colore Immaginelocal 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 - Colore di Canvas Grouplocal 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()
Tratto
Più proprietà controllano i bordi dell'UI, a seconda del tipo di oggetto.
In alternativa, puoi applicare un UIStroke figlio e tweenare il suo spessore, colore e/o trasparenza.
| Oggetto UI | Proprietà |
|---|---|
| UIStroke | Color, Thickness, Transparency |
UI Tween - Colore & Spessore 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()
Tween di più proprietà
Puoi combinare qualsiasi dei tween di singole proprietà in tween più complessi passando più proprietà obiettivo a TweenService:Create(), ad esempio posizione + rotazione o dimensione + trasparenza.
UI Tween - Posizione & Rotazionelocal 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 - Dimensione & Trasparenzalocal 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()
Sequenze di tween
Puoi concatenare animazioni UI per avvenire una dopo l'altra riproduttando ulteriori tweens all'evento Completed del tween precedente. Ad esempio, il seguente script sposta un oggetto al centro dello schermo, quindi lo ruota di 45°.
Sequenza di Tween UI
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})
-- Inizialmente riproduci il tween di posizione
positionTween:Play()
-- Riproduci il tween di rotazione al completamento del tween di posizione
positionTween.Completed:Connect(function()
rotationTween:Play()
end)
Transizioni di stile
Gli oggetti UI possono anche essere animati attraverso transizioni di stile, paragonabili alle transizioni CSS, dove una o più proprietà UI vengono tweenate tramite le definizioni di StyleRule. Vedi la guida Editor di Stili per maggiori dettagli.

Opzioni di easing
Utilizzando le opzioni di easing di TweenInfo, puoi controllare lo stile e la direzione dell'easing delle animazioni UI.
Stile
Enum.EasingStyle imposta il tasso di interpolazione dall'inizio alla fine. Per impostazione predefinita, lo stile di easing è impostato su Enum.EasingStyle.Quad.
| Stile | Descrizione |
|---|---|
| Lineare | Si muove a una velocità costante. |
| Seno | La velocità è determinata da un'onda sinusoidale per un movimento di easing dolce. |
| Quad | Simile a Seno ma con una curva leggermente più ripida basata sull'interpolazione quadratica. |
| Cubo | Simile a Quad ma con una curva leggermente più ripida basata sull'interpolazione cubica. |
| Quart | Simile a Cubo ma con una curva ancora più ripida basata sull'interpolazione quartica. |
| Quint | Simile a Quart ma con una curva ancora più ripida basata sull'interpolazione quintica. |
| Esponenziale | La curva più ripida basata sull'interpolazione esponenziale. |
| Circolare | Seguirà un arco circolare, in modo tale che l'accelerazione sia più brusca e la decelerazione più graduale rispetto a Quint o Esponenziale. |
| Retro | Supera leggermente l'obiettivo, quindi torna in posizione. |
| Rimbalzo | Rimbalza all'indietro più volte dopo aver raggiunto l'obiettivo, prima di stabilizzarsi. |
| Elastico | Si muove come se fosse attaccato a una fascia elastica, superando l'obiettivo diverse volte. |

Stile di Easing - Cubicolocal tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic)local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})
Direzione
Enum.EasingDirection definisce come l'interpolazione dello stile di easing si applica a un oggetto, con una impostazione predefinita di Out. Nota che un tween con lo stile di easing Lineare non è influenzato, poiché l'interpolazione lineare è costante dall'inizio alla fine.
| Direzione | Descrizione |
|---|---|
| In | Lo stile di easing si applica in avanti. |
| Out | Lo stile di easing si applica all'indietro. |
| InOut | Lo stile di easing si applica in avanti per la prima metà e all'indietro per la seconda metà. |
Direzione di Easing - InOutlocal tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic, Enum.EasingDirection.InOut)local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})
Effetto macchina da scrivere sul testo
Puoi facilmente migliorare l'UI basata su testo, come banner di scene, istruzioni per i giocatori e promemoria, con effetti animati. L'effetto "macchina da scrivere" è ideale per TextLabels che raccontano una storia, visualizzano conversazioni di NPC, ecc.
Crea un nuovo ModuleScript all'interno di ReplicatedStorage.
Rinomina il nuovo script AnimateUI.

Incolla il seguente codice nello 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-- Traduci il testo se possibileif translator thendisplayText = translator:Translate(guiObject, text)end-- Sostituisci i tag di interruzione di linea in modo che il ciclo grapheme non manchi quei caratteridisplayText = displayText:gsub("<br%s*/>", "\n")-- Rimuovi i tag RichText poiché l'animazione carattere per carattere romperà i tagdisplayText = displayText:gsub("<[^<>]->", "")-- Imposta il testo tradotto/modificato sul genitoreguiObject.Text = displayTextlocal index = 0for first, last in utf8.graphemes(displayText) doindex += 1guiObject.MaxVisibleGraphemes = indextask.wait(delayBetweenChars)endendreturn AnimateUICrea un TextLabel in una posizione adeguata, ad esempio all'interno di un ScreenGui parentato a StarterGui.
Inserisci un nuovo LocalScript come figlio diretto dell'etichetta e incolla il seguente codice. Nota che ogni messaggio è visualizzato chiamando AnimateUI.typeWrite() con parametri per l'oggetto genitore, la stringa da visualizzare e il ritardo tra i caratteri.
LocalScriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local AnimateUI = require(ReplicatedStorage:WaitForChild("AnimateUI"))local label = script.Parent-- Carica il traduttore se l'esperienza è localizzata--AnimateUI.loadTranslator()local message1 = [[Oltre questa porta c'è il<br /><font size="46" color="rgb(255,50,25)">Grande Zorgoth...</font> <font size="40">🗡</font>]]AnimateUI.typeWrite(label, message1, 0.05)task.wait(1)local message2 = [[...che governa questo dungeon <font color="rgb(255,200,50)">senza sfidealti!</font> <font size="30">😈</font>]]AnimateUI.typeWrite(label, message2, 0.05)