Nell'animazione, tweening è il processo di generazione di fotogrammi intermedi tra due punti chiave in una sequenza. Quando progetti un'interfaccia utente, puoi utilizzare il tweening per passare un GuiObject da uno stato all'altro in modo fluido, come ad esempio:
- Aumentare gradualmente 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 della 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 target a TweenService:Create().
- Riproduci il tween con Tween:Play().
Il seguente frammento di codice sposta un ImageLabel all'interno di un ScreenGui al centro esatto dello schermo:
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()Dimensione
Per tweenare la dimensione di un GuiObject:
- Attacca un UIAspectRatioConstraint all'oggetto per mantenere il suo rapporto d'aspetto progettato durante il tweening.
- Passa un TweenInfo e la dimensione target 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:
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()Rotazione
Per tweenare la rotazione di un GuiObject:
- Imposta il AnchorPoint per l'oggetto attorno al quale ruotare.
- Determina la Rotation target per l'oggetto.
- Passa un TweenInfo e la rotazione target a TweenService:Create().
- Riproduci il tween con 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()Trasparenza
Più proprietà controllano la trasparenza dell'interfaccia utente, a seconda del tipo di oggetto. Puoi tweenare ciascuna di queste proprietà singolarmente 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.
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()Colore
Più proprietà controllano il colore dell'interfaccia utente, a seconda del tipo di oggetto. Puoi tweenare ciascuna di queste proprietà singolarmente 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 la GroupColor3 del gruppo.
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()Tratto
Più proprietà controllano i bordi dell'interfaccia utente, a seconda del tipo di oggetto.
In alternativa, puoi applicare un figlio UIStroke e tweenare il suo spessore, colore e/o trasparenza.
| Oggetto UI | Proprietà |
|---|---|
| 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()Tween di più proprietà
Puoi combinare qualsiasi dei tween di singole proprietà in tween più complessi passando più proprietà target a TweenService:Create(), ad esempio posizione + rotazione o dimensione + trasparenza.
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()Sequenze di tween
Puoi concatenare le animazioni UI affinché si verifichino una dopo l'altra riproducendo i tween successivi all'evento Completed del tween precedente. Ad esempio, il seguente script sposta un oggetto al centro dello schermo, quindi lo ruota di 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})
-- Riproduci inizialmente 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, comparabili alle transizioni CSS, dove una o più proprietà UI vengono tweenate attraverso le definizioni di StyleRule. Vedi la guida Style Editor per 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 delicato. |
| 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 | Segue un arco circolare, in modo che l'accelerazione sia più improvvisa e la decelerazione più graduale rispetto a Quint o Esponenziale. |
| Back | Supera leggermente l'obiettivo, quindi torna al suo posto. |
| Rimbalzo | Rimbalza all'indietro più volte dopo aver raggiunto l'obiettivo, prima di stabilizzarsi infine. |
| Elastico | Si muove come se fosse attaccato a una fascia elastica, superando l'obiettivo più volte. |

local 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 un valore predefinito di Out. Nota che un tween con 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 una direzione avanti. |
| Out | Lo stile di easing si applica in una direzione inversa. |
| InOut | Lo stile di easing si applica in avanti per la prima metà e in inverso per la seconda metà. |
local 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'interfaccia utente basata su testo, come banner di scene, istruzioni per i giocatori e messaggi, con effetti animati. L'effetto "macchina da scrivere" è ideale per TextLabels che raccontano una storia, producono conversazioni di NPC, ecc.
Crea un nuovo ModuleScript all'interno di ReplicatedStorage.
Rinomina il nuovo script in 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 riga in modo che il ciclo dei grafemi non perda 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 adatta, come all'interno di un ScreenGui genitore di StarterGui.
Inserisci un nuovo LocalScript come figlio diretto dell'etichetta e incolla il seguente codice. Nota che ogni messaggio viene prodotto chiamando AnimateUI.typeWrite() con parametri per l'oggetto genitore, la stringa da produrre 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 il gioco è localizzato--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 sfide!</font> <font size="30">😈</font>]]AnimateUI.typeWrite(label, message2, 0.05)