Sebuah pola debounce adalah teknik pengkodean yang mencegah fungsi berjalan terlalu sering atau input memicu beberapa kali. Skenario pengkodean berikut menggambarkan debounce sebagai praktik terbaik.
Deteksi tabrakan
Misalkan Anda ingin membuat bagian jebakan berbahaya yang memberikan 10 kerusakan saat disentuh. Implementasi awal mungkin menggunakan koneksi dasar BasePart.Touched dan fungsi damagePlayer seperti ini:
Script - Damage Player
local part = script.Parent
local function damagePlayer(otherPart)
print(part.Name .. " bertabrakan dengan " .. otherPart.Name)
local humanoid = otherPart.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health -= 10 -- Kurangi kesehatan pemain
end
end
part.Touched:Connect(damagePlayer)
Meskipun logis pada pandangan pertama, pengujian akan menunjukkan bahwa peristiwa Touched ditembakkan beberapa kali dalam waktu cepat berdasarkan tabrakan fisik yang halus.

Untuk menghindari kerusakan berlebihan pada kontak awal, Anda dapat menambahkan sistem debounce yang memberlakukan periode cooldown pada kerusakan melalui atribut instance.
Script - Damage Player Using Debounce
local part = script.Parent
local RESET_TIME = 1
local function damagePlayer(otherPart)
print(part.Name .. " bertabrakan dengan " .. otherPart.Name)
local humanoid = otherPart.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
if not part:GetAttribute("Touched") then
part:SetAttribute("Touched", true) -- Set atribut menjadi true
humanoid.Health -= 10 -- Kurangi kesehatan pemain
task.wait(RESET_TIME) -- Tunggu selama durasi reset
part:SetAttribute("Touched", false) -- Reset atribut
end
end
end
part.Touched:Connect(damagePlayer)
Memicu suara
Debounce juga berguna saat bekerja dengan efek suara, seperti memainkan suara saat dua bagian bertabrakan (Touched), atau memainkan suara pada peristiwa Activated saat pengguna berinteraksi dengan tombol di layar. Dalam kedua kasus tersebut, memanggil Sound:Play() memulai pemutaran dari awal trek dan — tanpa sistem debounce — suara dapat diputar beberapa kali dalam waktu cepat.
Untuk mencegah tumpang tindih suara, Anda dapat menggunakan debounce dengan properti IsPlaying dari objek Sound:
Script - Play Collision Sound Using Debounce
local projectile = script.Parent
local function playSound()
-- Temukan suara anak di bagian
local sound = projectile:FindFirstChild("Impact")
-- Putar suara hanya jika belum diputar
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Script - Play Button Click Using Debounce
local button = script.Parent
local function onButtonActivated()
-- Temukan suara anak di tombol
local sound = button:FindFirstChild("Click")
-- Putar suara hanya jika belum diputar
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)
Efek pengambilan
Permainan sering kali menyertakan pengambilan koleksi di dunia 3D seperti kotak pertolongan pertama, paket amunisi, dan lainnya. Jika Anda merancang pengambilan ini untuk tetap berada di dunia agar pemain dapat mengambilnya berulang kali, waktu "cooldown" harus ditambahkan sebelum pengambilan dapat menyegarkan dan mengaktifkan kembali.
Mirip dengan mendeteksi tabrakan, Anda dapat mengelola status debounce dengan atribut instance, dan memvisualisasikan periode cooldown dengan mengubah Transparency bagian.
Script - Health Pickup Using Debounce
local part = script.Parent
part.Anchored = true
part.CanCollide = false
local COOLDOWN_TIME = 5
local function healPlayer(otherPart)
local humanoid = otherPart.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
if not part:GetAttribute("CoolingDown") then
part:SetAttribute("CoolingDown", true) -- Set atribut menjadi true
humanoid.Health += 25 -- Tambah kesehatan pemain
part.Transparency = 0.75 -- Buat bagian semi-transparan untuk menunjukkan status cooldown
task.wait(COOLDOWN_TIME) -- Tunggu selama durasi cooldown
part.Transparency = 0 -- Reset bagian menjadi sepenuhnya opak
part:SetAttribute("CoolingDown", false) -- Reset atribut
end
end
end
part.Touched:Connect(healPlayer)