Sebuah pola debounce adalah teknik pemrograman yang mencegah fungsi menjalankan terlalu banyak kali atau input memicu berkali-kali.Skenario skrip berikut menggambarkan debounce sebagai praktik terbaik.
Deteksi tabrakan
Anggaplah Anda ingin membuat bagian perangkap berbahaya yang menimbulkan 10 kerusakan saat disentuh.Implementasi awal mungkin menggunakan koneksi dasar BasePart.Touched dan fungsi damagePlayer seperti ini:
Skrip - Merusak Pemain
local part = script.Parent
local function damagePlayer(otherPart)
print(part.Name .. " collided with " .. 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 terbakar beberapa kali dalam urutan singkat berdasarkan tabrakan fisik halus.

Untuk menghindari menyebabkan kerusakan berlebih pada kontak awal, Anda dapat menambahkan sistem debounce yang memerintahkan periode penundaan pada kerusakan melalui atribut instance .
Skrip - Merusak Pemain Menggunakan Debounce
local part = script.Parent
local RESET_TIME = 1
local function damagePlayer(otherPart)
print(part.Name .. " collided with " .. otherPart.Name)
local humanoid = otherPart.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
if not part:GetAttribute("Touched") then
part:SetAttribute("Touched", true) -- Atur atribut ke benar
humanoid.Health -= 10 -- Kurangi kesehatan pemain
task.wait(RESET_TIME) -- Tunggu durasi reset
part:SetAttribute("Touched", false) -- Setel ulang atribut
end
end
end
part.Touched:Connect(damagePlayer)
Aktifkan suara
Debounce juga berguna saat bekerja dengan efek suara, seperti memutar suara saat dua bagian bertabrakan ( Touched ), atau memutar suara pada acara Activated ketika pengguna berinteraksi dengan tombol di layar.Dalam kedua kasus, memanggil Sound:Play() memulai pemutaran dari awal treknya dan - tanpa sistem debounce - suara dapat diputar beberapa kali dalam urutan singkat.
Untuk mencegah interferensi suara, Anda dapat mengurangi penggunaan properti IsPlaying dari objek Sound:
Skrip - Mainkan Suara Tabrakan Menggunakan Debounce
local projectile = script.Parent
local function playSound()
-- Temukan suara anak di bagian
local sound = projectile:FindFirstChild("Impact")
-- Mainkan suara hanya jika belum diputar
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Skrip - Tombol Putar Klik Menggunakan Debounce
local button = script.Parent
local function onButtonActivated()
-- Temukan suara anak di tombol
local sound = button:FindFirstChild("Click")
-- Mainkan suara hanya jika belum diputar
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)
Efek penjemputan
Pengalaman sering termasuk pengambilan koleksi di dunia 3D seperti medkit, paket amunisi, dan banyak lagi.Jika Anda merancang penjemputan ini untuk tetap berada di dunia bagi pemain untuk mengambil lagi dan lagi, waktu "pengaturan ulang" harus ditambahkan sebelum penyegaran dan aktivasi ulang penjemputan.
Mirip dengan mendeteksi tabrakan , Anda dapat mengelola negara debounce dengan anggaran instansi , dan visualisasikan periode pendinginan dengan mengubah bagian .
Skrip - Penjemputan Kesehatan Menggunakan 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) -- Atur atribut ke benar
humanoid.Health += 25 -- Tingkatkan kesehatan pemain
part.Transparency = 0.75 -- Jadikan bagian semi-transparan untuk menunjukkan status pendinginan
task.wait(COOLDOWN_TIME) -- Tunggu durasi pendinginan
part.Transparency = 0 -- Setel ulang bagian menjadi benar-benar tidak transparan
part:SetAttribute("CoolingDown", false) -- Setel ulang atribut
end
end
end
part.Touched:Connect(healPlayer)