Na animações, tweening é o processo de geração de quadros intermediários entre dois pontos-chave em uma sequência. Ao projetar uma interface do usuário, você pode usar tweening para fazer a transição de um GuiObject sem problemas de um estado para outro, como:
- Suavizar o tamanho de um botão quando um usuário selecioná-lo.
- Navegação de UI deslizante na borda da tela.
- Animação gradual de uma barra de saúde entre duas larguras quando um usuário recebe um boost de saúde.
Adolescentes de Propriedade Única
Posição
Para ajustar a posição de um GuiObject:
- Definir o AnchorPoint para o Objeto.
- Passe um TweenInfo e a posição de destino para TweenService:Create().
- Jogue o tween com Tween:Play() .
O seguinte código de exemplo move um ImageLabel dentro de um ScreenGui para o centro exato da tela:
UI Tween - Posição
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()
Tamanho
Para ajustar o tamanho do tamanho de um GuiObject :
- Atenha um UIAspectRatioConstraint ao objeto para manter sua proporção de aspecto projetada ao ajustar.
- Passe um TweenInfo e o tamanho do alvo para TweenService:Create().
- Jogue o tween com Tween:Play() .
O seguinte código de exemplo escala um ImageLabel dentro de um ScreenGui para 40% da largura ou altura da tela (que for menor) do ponto de ancoragem do Objeto:
UI Tween - Tamanho
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 = 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()
Rotação
Para ajustar a rotação de um GuiObject:
- Definir o AnchorPoint para que o objeto gire em torno.
- Determine o alvo Rotation para o Objeto.
- Passe um TweenInfo e a rotação do alvo para TweenService:Create().
- Jogue o tween com Tween:Play() .
UI Tween - Tamanho
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 = 45local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(object, tweenInfo, {Rotation = targetRotation})tween:Play()
Transparência
A interface de controle de propriedades múltiplas controla a transparência da UI da propriedade, dependendo do digitarde objeto. Você pode ajustar cada uma dessas propriedades individualmente ou combinadas através de um multijogar propriedade tween. Alternativamente, você pode ajustar a transparência geral do Objetocolocando-o dentro de um CanvasGroup e tweening o grupo's
UI Tween - Transparência da Imagem
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.8local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(object, tweenInfo, {ImageTransparency = targetTransparency})tween:Play()
UI Tween - Visibilidade do Grupo de Canvas
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.8local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(canvasGroup, tweenInfo, {GroupTransparency = targetTransparency})tween:Play()
Cor
A cor da tela de controle de propriedades múltiplas depende do digitarde objeto. Você pode ajustar cada uma dessas propriedades individualmente ou combinado através de uma interface de controle de propriedades múltipla. Alternativamente, você pode ajustar a cor geral de um Objetocolocando-o dentro de um CanvasGroup e ajustando a cor do grupo Class.CanvasGroup.GroupColor3
Objeto de UI | Propriedades |
---|---|
Frame | BackgroundColor3 , BorderColor3 |
TextLabel | BackgroundColor3 , BorderColor3 , TextColor3 , 0> Class.TextLabel.TextStrokeColor3|TextStrokeColor30> |
TextButton | BackgroundColor3 , BorderColor3 , TextColor3 , 0> Class.TextButton.TextStrokeColor3|TextStrokeColor30> |
ImageLabel | BackgroundColor3 , BorderColor3 , ImageColor3 |
ImageButton | BackgroundColor3 , BorderColor3 , ImageColor3 |
UI Tween - Cor da Imagem
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()
UI Tween - Cor do Grupo Canvas
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()
Pontuação
Múltiplas propriedades controlam as bordas da UI, dependendo do digitarde objeto.
Objeto de UI | Propriedades |
---|---|
Frame | BorderSizePixel , BorderColor3 |
TextLabel | BorderSizePixel , BorderColor3 , TextStrokeColor3 , 0> Class.TextLabel.TextStrokeTransparency|TextStrokeTransparency0> |
TextButton | BorderSizePixel , BorderColor3 , TextStrokeColor3 , 0> Class.TextButton.TextStrokeTransparencyTransparency0> |
ImageLabel | BorderSizePixel , BorderColor3 |
ImageButton | BorderSizePixel , BorderColor3 |
Alternativamente, você pode aplicar uma criança UIStroke e ajustar sua espessura, cor e/ou transparência.
Objeto de UI | Propriedades |
---|---|
UIStroke | Color , Thickness , Transparency |
UI Tween - Cor e Espessura de UIStroke
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 = 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()
Adolescentes de Propriedade Múltipla
Você pode combinar qualquer um dos tweens de propriedade única em mais tweens complexos ao passar várias propriedades de alvo para TweenService:Create(), por exemplo, posição + rotação ou 2>tamanho + transparência2>.
UI Tween - Posição e Rotação
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 = 45local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(object, tweenInfo, {Position = targetPosition, Rotation = targetRotation})tween:Play()
UI Tween - Tamanho e Transparência
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 = 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()
Sequências de Tween
Você pode sincronizar animações de UI para ocorrer uma após a outra jogando um menino seguinte no evento Completed do interseçãoanterior. Por exemplo, o seguinte script move um objeto para o centro da tela, então gira-o em 45°.
Sequência de Criação de Botões
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})
-- Inicialmente jogar posição interseção
positionTween:Play()
-- Jogue a rotação de ajuste ao completar a interseçãode posição
positionTween.Completed:Connect(function()
rotationTween:Play()
end)
Opções de Ajuste
Usando as opções de facilitação de TweenInfo, você pode controlar o estilo de fácil e direção das animações da UI.
Estilo
Enum.EasingStyle define a taxa de interpolação de início até o terminar/parar/sair. Por padrão, o estilo de interpolação é definido como Enum.EasingStyle.Quad.
Estilo | Descrição |
---|---|
Linhares | Mova-se em uma velocidade constante. |
Sinos | A velocidade é determinada por uma onda sinusoidal para um movimento suave. |
Quadro | Semelhante a Sine mas com uma curva ligeiramente mais afiada com base em interpolação quadrática. |
Cúbico | Semelhante a Quadro mas com uma curva ligeiramente mais afiada com base na interpolação cúbica. |
Quarto | Semelhante a Cúbico mas com uma curva ainda mais afiada com base em interpolação de quarto. |
Quinteto | Semelhante a Quart mas com uma curva ainda mais afiada com base em interpolação quintica. |
Exponencial | A curva mais afiada com base em interpolação exponencial. |
Circular | Segue um arco circular, como a aceleração é mais brusca e a deceleração mais gradual em relação a Quint ou Exponencial . |
Voltar | Sobreposiciona um pouco o alvo, então voltará ao seu local. |
Pulo de Bounce | Salta para trás múltiplas vezes depois de alcançar o alvo, antes de finalmente se estabelecer. |
Elástico | Se move como se estivesse preso em uma faixa de borracha, superposição de várias vezes do alvo. |
Estilo de Aplainar - Cúbico
local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic)local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})
Direção
Enum.EasingDirection define como a interpolação de estilo de fácil aplica-se a um Objeto, com um padrão de Saída . Observe que uma tween com estilo de 0>linha0> não é afetada, pois a interpolação de linha é constante do começo ao terminar/parar/sair.
Direção | Descrição |
---|---|
Em | O estilo de alivio se aplica em uma direção para a frente. |
Fora | O estilo de alívio se aplica em uma direção reversa. |
InOut | O estilo de alívio se aplica para a primeira metade e para trás para a segunda metade. |
Direção de Acolchego - InOut
local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic, Enum.EasingDirection.InOut)local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})
Texto Animado
Você pode facilmente melhorar a interface baseada em texto, como banners de cutscene, instruções de jogador e prompts, com efeitos animados.
Efeito de Tipo
O efeito "tipo escrivel" é ideal para TextLabels que contam uma história, produzem diálogos de NPC, etc.
Crie um novo ModuleScript dentro de ReplicatedStorage .
Renomeie o novo script AnimateUI .
Paste o seguinte código no script:
ModuleScript - Animação de UIlocal 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-- Traduzir o texto se possívelif translator thendisplayText = translator:Translate(guiObject, text)end-- Substituir linhas quebradas para que o loop de gráficos não perca esses caracteresdisplayText = displayText:gsub("<br%s*/>", "\n")-- Remova as tags RichText, pois a animação char-by-char irá quebrar as tagsdisplayText = displayText:gsub("<[^<>]->", "")-- Definir texto traduzido/modificado no paiguiObject.Text = displayTextlocal index = 0for first, last in utf8.graphemes(displayText) doindex += 1guiObject.MaxVisibleGraphemes = indextask.wait(delayBetweenChars)endendreturn AnimateUICrie um TextLabel em um local adequado, como dentro de um ScreenGui paiado para StarterGui .
Insira um novo LocalScript como filho direto da etiqueta e cole no seguinte código. Observe que cada mensagem é uma saída por chamar AnimateUI.typeWrite() com parâmetros para o Objetopai, a string para sair e o atraso entre os caracteres.
Script Locallocal ReplicatedStorage = game:GetService("ReplicatedStorage")local AnimateUI = require(ReplicatedStorage:WaitForChild("AnimateUI"))local label = script.Parent-- Carregar tradutor se o jogo for localizado--AnimateUI.loadTranslator()local message1 = [[Beyond this door is the<br /><font size="46" color="rgb(255,50,25)">Great Zorgoth...</font> <font size="40">🗡</font>]]AnimateUI.typeWrite(label, message1, 0.05)task.wait(1)local message2 = [[...who rules this dungeon <font color="rgb(255,200,50)">unchallenged!</font> <font size="30">😈</font>]]AnimateUI.typeWrite(label, message2, 0.05)