Dalam animasi, tweening adalah proses menghasilkan frame antara dua titik kunci dalam sebuah urutan. Saat merancang antarmuka pengguna, Anda dapat menggunakan tweening untuk mentransisikan GuiObject dengan mulus dari satu keadaan ke keadaan lain, seperti:
- Meningkatkan ukuran tombol dengan mulus saat pengguna memilihnya.
- Menggeser menu UI masuk dan keluar dari tepi layar.
- Secara bertahap menganimasi bilah kesehatan antara dua lebar saat pengguna menerima peningkatan kesehatan.
Tween satu properti
Posisi
Untuk tween posisi dari GuiObject:
- Atur AnchorPoint untuk objek tersebut.
- Berikan TweenInfo dan posisi target ke TweenService:Create().
- Putar tween dengan Tween:Play().
Potongan kode berikut memindahkan ImageLabel dalam ScreenGui ke pusat layar yang tepat:
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()Ukuran
Untuk tween ukuran dari GuiObject:
- Pasang UIAspectRatioConstraint ke objek untuk mempertahankan rasio aspek yang dirancang saat tweening.
- Berikan TweenInfo dan ukuran target ke TweenService:Create().
- Putar tween dengan Tween:Play().
Potongan kode berikut mengubah ukuran ImageLabel dalam ScreenGui menjadi 40% dari lebar atau tinggi layar (mana yang lebih kecil) dari titik jangkar pusat objek:
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()Rotasi
Untuk tween rotasi dari GuiObject:
- Atur AnchorPoint untuk objek yang akan diputar.
- Tentukan Rotation target untuk objek tersebut.
- Berikan TweenInfo dan rotasi target ke TweenService:Create().
- Putar tween dengan 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()Transparansi
Beberapa properti mengontrol transparansi UI, tergantung pada jenis objek. Anda dapat tween masing-masing properti ini secara individu atau digabungkan melalui multi-property tween. Sebagai alternatif, Anda dapat tween transparansi keseluruhan objek dengan menempatkannya di dalam CanvasGroup dan tween transparansi grup GroupTransparency.
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()Warna
Beberapa properti mengontrol warna UI, tergantung pada jenis objek. Anda dapat tween masing-masing properti ini secara individu atau digabungkan melalui multi-property tween. Sebagai alternatif, Anda dapat tween warna keseluruhan objek dengan menempatkannya di dalam CanvasGroup dan tween warna grup GroupColor3.
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()Stroke
Beberapa properti mengontrol batas UI, tergantung pada jenis objek.
Sebagai alternatif, Anda dapat menerapkan anak UIStroke dan tween ketebalan, warna, dan/atau transparansinya.
| Objek UI | Properti |
|---|---|
| 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 multi-properti
Anda dapat menggabungkan salah satu dari tween satu properti menjadi tween yang lebih kompleks dengan memberikan beberapa properti target ke TweenService:Create(), misalnya posisi + rotasi atau ukuran + transparansi.
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()Urutan tween
Anda dapat menghubungkan animasi UI untuk terjadi satu setelah yang lain dengan memutar tween berikutnya setelah event Completed dari tween sebelumnya. Misalnya, skrip berikut memindahkan objek ke pusat layar, kemudian memutarnya sebesar 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})
-- Awalnya putar tween posisi
positionTween:Play()
-- Putar tween rotasi setelah tween posisi selesai
positionTween.Completed:Connect(function()
rotationTween:Play()
end)Transisi gaya
Objek UI juga dapat dianimasi melalui transisi gaya, yang sebanding dengan transisi CSS, di mana satu atau lebih properti UI di tween melalui definisi StyleRule. Lihat panduan Editor Gaya untuk detail lebih lanjut.

Opsi easing
Dengan menggunakan opsi easing dari TweenInfo, Anda dapat mengontrol gaya dan arah easing dari animasi UI.
Gaya
Enum.EasingStyle mengatur laju interpolasi dari awal hingga akhir. Secara default, gaya easing diatur ke Enum.EasingStyle.Quad.
| Gaya | Deskripsi |
|---|---|
| Linear | Bergerak dengan kecepatan konstan. |
| Sine | Kecepatan ditentukan oleh gelombang sinus untuk gerakan easing yang lembut. |
| Quad | Mirip dengan Sine tetapi dengan kurva yang sedikit lebih tajam berdasarkan interpolasi kuadratik. |
| Cubic | Mirip dengan Quad tetapi dengan kurva yang sedikit lebih tajam berdasarkan interpolasi kubik. |
| Quart | Mirip dengan Cubic tetapi dengan kurva yang lebih tajam berdasarkan interpolasi kuartik. |
| Quint | Mirip dengan Quart tetapi dengan kurva yang lebih tajam berdasarkan interpolasi quintik. |
| Exponential | Kurva paling tajam berdasarkan interpolasi eksponensial. |
| Circular | Mengikuti busur melingkar, sehingga percepatan lebih mendadak dan perlambatan lebih bertahap dibandingkan dengan Quint atau Exponential. |
| Back | Sedikit melampaui target, kemudian kembali ke tempat. |
| Bounce | Memantul ke belakang beberapa kali setelah mencapai target, sebelum akhirnya menetap. |
| Elastic | Bergerak seolah terikat pada karet, melampaui target beberapa kali. |

local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic)
local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})Arah
Enum.EasingDirection mendefinisikan bagaimana interpolasi gaya easing diterapkan pada objek, dengan default Out. Perhatikan bahwa tween dengan gaya easing Linear tidak terpengaruh, karena interpolasi linier konstan dari awal hingga akhir.
| Arah | Deskripsi |
|---|---|
| In | Gaya easing diterapkan dalam arah maju. |
| Out | Gaya easing diterapkan dalam arah mundur. |
| InOut | Gaya easing diterapkan maju untuk setengah pertama dan mundur untuk setengah kedua. |
local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic, Enum.EasingDirection.InOut)
local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})Efek mesin ketik pada teks
Anda dapat dengan mudah meningkatkan UI berbasis teks, seperti spanduk cutscene, instruksi pemain, dan prompt, dengan efek animasi. Efek "mesin ketik" sangat ideal untuk TextLabels yang menceritakan sebuah cerita, menampilkan percakapan NPC, dll.
Buat ModuleScript baru di dalam ReplicatedStorage.
Ganti nama skrip baru menjadi AnimateUI.

Tempelkan kode berikut ke dalam skrip:
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-- Terjemahkan teks jika memungkinkanif translator thendisplayText = translator:Translate(guiObject, text)end-- Ganti tag pemisah baris sehingga loop grapheme tidak akan melewatkan karakter tersebutdisplayText = displayText:gsub("<br%s*/>", "\n")-- Hapus tag RichText karena animasi karakter-per-karakter akan merusak tagdisplayText = displayText:gsub("<[^<>]->", "")-- Atur teks yang diterjemahkan/dimodifikasi pada indukguiObject.Text = displayTextlocal index = 0for first, last in utf8.graphemes(displayText) doindex += 1guiObject.MaxVisibleGraphemes = indextask.wait(delayBetweenChars)endendreturn AnimateUIBuat TextLabel di lokasi yang sesuai, seperti di dalam ScreenGui yang diparent ke StarterGui.
Sisipkan LocalScript baru sebagai anak langsung dari label dan tempelkan kode berikut. Perhatikan bahwa setiap pesan dikeluarkan dengan memanggil AnimateUI.typeWrite() dengan parameter untuk objek induk, string yang akan dikeluarkan, dan jeda antara karakter.
LocalScriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local AnimateUI = require(ReplicatedStorage:WaitForChild("AnimateUI"))local label = script.Parent-- Muat penerjemah jika permainan dilokalisasi--AnimateUI.loadTranslator()local message1 = [[Di balik pintu ini adalah<br /><font size="46" color="rgb(255,50,25)">Zorgoth Agung...</font> <font size="40">🗡</font>]]AnimateUI.typeWrite(label, message1, 0.05)task.wait(1)local message2 = [[...yang menguasai dungeon ini <font color="rgb(255,200,50)">tanpa tantangan!</font> <font size="30">😈</font>]]AnimateUI.typeWrite(label, message2, 0.05)