En animación, la interpolación es el proceso de generar fotogramas intermedios entre dos puntos clave en una secuencia. Al diseñar una interfaz de usuario, puedes usar la interpolación para hacer transiciones suaves de un GuiObject de un estado a otro, como:
- Aumentar suavemente el tamaño de un botón cuando un usuario lo selecciona.
- Deslizar menús de la interfaz en y fuera de los bordes de la pantalla.
- Animar gradualmente una barra de salud entre dos anchos cuando un usuario recibe un impulso de salud.
Interpolaciones de una sola propiedad
Posición
Para interpolar la posición de un GuiObject:
- Establece el AnchorPoint para el objeto.
- Pasa un TweenInfo y la posición objetivo a TweenService:Create().
- Reproduce la interpolación con Tween:Play().
El siguiente fragmento de código mueve un ImageLabel dentro de un ScreenGui al centro exacto de la pantalla:
Interpolación de UI - Posiciónlocal 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()
Tamaño
Para interpolar el tamaño de un GuiObject:
- Adjunta un UIAspectRatioConstraint al objeto para mantener su relación de aspecto diseñada al interpolar.
- Pasa un TweenInfo y el tamaño objetivo a TweenService:Create().
- Reproduce la interpolación con Tween:Play().
El siguiente fragmento de código escala un ImageLabel dentro de un ScreenGui al 40% del ancho o alto de la pantalla (el que sea menor) desde el punto de anclaje central del objeto:
Interpolación de UI - Tamañolocal 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()
Rotación
Para interpolar la rotación de un GuiObject:
- Establece el AnchorPoint para el objeto alrededor del cual rotará.
- Determina la Rotation objetivo para el objeto.
- Pasa un TweenInfo y la rotación objetivo a TweenService:Create().
- Reproduce la interpolación con Tween:Play().
Interpolación de UI - Rotaciónlocal 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()
Transparencia
Varias propiedades controlan la transparencia de la interfaz, dependiendo del tipo de objeto. Puedes interpolar cada una de estas propiedades individualmente o combinadas a través de una interpolación de múltiples propiedades. Alternativamente, puedes interpolar la transparencia general de un objeto colocándolo dentro de un CanvasGroup y interpolando la GroupTransparency del grupo.
Interpolación de UI - Transparencia de Imagenlocal 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()
Interpolación de UI - Transparencia de 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()
Color
Varias propiedades controlan el color de la UI, dependiendo del tipo de objeto. Puedes interpolar cada una de estas propiedades individualmente o combinadas a través de una interpolación de múltiples propiedades. Alternativamente, puedes interpolar el color general de un objeto colocándolo dentro de un CanvasGroup e interpolando el GroupColor3 del grupo.
Interpolación de UI - Color de Imagenlocal 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()
Interpolación de UI - Color de 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()
Trazo
Múltiples propiedades controlan los bordes de la UI, dependiendo del tipo de objeto.
Alternativamente, puedes aplicar un hijo UIStroke y entrelazar su grosor, color y/o transparencia.
| Objeto UI | Propiedades |
|---|---|
| UIStroke | Color, Thickness, Transparency |
Interpolación de UI - Color y Grosor de 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()
Interpolaciones de múltiples propiedades
Puedes combinar cualquiera de las interpolaciones de una sola propiedad en interpolaciones más complejas pasando múltiples propiedades objetivo a TweenService:Create(), por ejemplo posición + rotación o tamaño + transparencia.
Interpolación de UI - Posición y Rotaciónlocal 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()
Interpolación de UI - Tamaño y Transparencialocal 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()
Secuencias de interpolaciones
Puedes encadenar animaciones de UI para que ocurran una tras otra reproduciendo interpolaciones sucesivas en el evento Completed de la interpolación anterior. Por ejemplo, el siguiente script mueve un objeto al centro de la pantalla, luego lo rota 45°.
Secuencia de Interpolación de 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})
-- Reproduce inicialmente la interpolación de posición
positionTween:Play()
-- Reproduce la interpolación de rotación al completar la interpolación de posición
positionTween.Completed:Connect(function()
rotationTween:Play()
end)
Transiciones de estilo
Los objetos de UI también pueden ser animados a través de transiciones de estilo, comparables a transiciones CSS, donde una o más propiedades de UI se interpolan a través de definiciones de StyleRule. Consulta la guía de Editor de Estilo para más detalles.

Opciones de suavizado
Usando las opciones de suavizado de TweenInfo, puedes controlar el estilo y la dirección del suavizado de las animaciones de UI.
Estilo
Enum.EasingStyle establece la tasa de interpolación desde el inicio hasta el final. Por defecto, el estilo de suavizado está configurado en Enum.EasingStyle.Quad.
| Estilo | Descripción |
|---|---|
| Lineal | Se mueve a una velocidad constante. |
| Seno | La velocidad está determinada por una onda seno para un movimiento de suavizado suave. |
| Cuadrático | Similar a Seno pero con una curva ligeramente más aguda basada en interpolación cuadrática. |
| Cúbico | Similar a Cuadrático pero con una curva ligeramente más aguda basada en interpolación cúbica. |
| Cuártico | Similar a Cúbico pero con una curva aún más aguda basada en interpolación cuártica. |
| Quint | Similar a Cuártico pero con una curva aún más aguda basada en interpolación quintica. |
| Exponencial | La curva más aguda basada en interpolación exponencial. |
| Circular | Sigue un arco circular, de tal manera que la aceleración es más repentina y la desaceleración más gradual en comparación con Quint o Exponencial. |
| Retroceso | Sobrepasa ligeramente el objetivo, luego regresa a su lugar. |
| Rebote | Rebota varias veces hacia atrás después de alcanzar el objetivo, antes de finalmente estabilizarse. |
| Elástico | Se mueve como si estuviera unido a una banda elástica, sobrepasando el objetivo varias veces. |

Estilo de Suavizado - Cúbicolocal tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic)local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})
Dirección
Enum.EasingDirection define cómo se aplica la interpolación del estilo de suavizado a un objeto, con un valor por defecto de Out. Toma en cuenta que una interpolación con estilo de suavizado Lineal no se ve afectada, ya que la interpolación lineal es constante desde el inicio hasta el final.
| Dirección | Descripción |
|---|---|
| In | El estilo de suavizado se aplica en una dirección hacia adelante. |
| Out | El estilo de suavizado se aplica en una dirección inversa. |
| InOut | El estilo de suavizado se aplica hacia adelante en la primera mitad y en reversa en la segunda mitad. |
Dirección de Suavizado - InOutlocal tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic, Enum.EasingDirection.InOut)local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})
Efecto máquina de escribir en texto
Puedes mejorar fácilmente la UI basada en texto, como banners de escenas, instrucciones para jugadores y avisos, con efectos animados. El efecto de "máquina de escribir" es ideal para TextLabels que cuentan una historia, muestran conversaciones de NPC, etc.
Crea un nuevo ModuleScript dentro de ReplicatedStorage.
Cambia el nombre del nuevo script a AnimateUI.

Pega el siguiente código en el 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-- Traduce el texto si es posibleif translator thendisplayText = translator:Translate(guiObject, text)end-- Reemplaza las etiquetas de salto de línea para que el bucle de grafemas no se pierda esos caracteresdisplayText = displayText:gsub("<br%s*/>", "\n")-- Elimina las etiquetas RichText ya que la animación caracter por caracter romperá las etiquetasdisplayText = displayText:gsub("<[^<>]->", "")-- Establece el texto traducido/modificado en el padreguiObject.Text = displayTextlocal index = 0for first, last in utf8.graphemes(displayText) doindex += 1guiObject.MaxVisibleGraphemes = indextask.wait(delayBetweenChars)endendreturn AnimateUICrea un TextLabel en una ubicación adecuada, como dentro de un ScreenGui parentado a StarterGui.
Inserta un nuevo LocalScript como un hijo directo de la etiqueta y pega el siguiente código. Ten en cuenta que cada mensaje se muestra llamando a AnimateUI.typeWrite() con parámetros para el objeto padre, la cadena a mostrar, y el retraso entre caracteres.
LocalScriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local AnimateUI = require(ReplicatedStorage:WaitForChild("AnimateUI"))local label = script.Parent-- Cargar traductor si la experiencia está localizada--AnimateUI.loadTranslator()local message1 = [[Más allá de esta puerta se encuentra el<br /><font size="46" color="rgb(255,50,25)">Gran Zorgoth...</font> <font size="40">🗡</font>]]AnimateUI.typeWrite(label, message1, 0.05)task.wait(1)local message2 = [[...quien gobierna esta mazmora <font color="rgb(255,200,50)">sin oposición!</font> <font size="30">😈</font>]]AnimateUI.typeWrite(label, message2, 0.05)