Sebuah pola debounce adalah teknik kode yang mencegah fungsi berjalan terlalu banyak kali atau input mengaktifkan lebih dari satu kali. Berikut contoh skrip yang menunjukkan debounce sebagai praktik terbaik.
Mendeteksi Tabrakan
Misalkan Anda ingin membuat bagian perangkap berbahaya yang menimbulkan 10 kerusakan saat disentuh. Penerapan awal mungkin menggunakan koneksi BasePart.Touched dasar 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)
Sementara logikal pada pandangan pertama, tes akan menunjukkan bahwa acara Touched menghasilkan banyak kali dalam waktu cepat berdasarkan tabrakan fisik subtil.
Untuk menghindari menyebabkan kerusakan berlebihan pada kontak awal, Anda dapat menambahkan sistem rebounce yang mengatur cooldown pada kerusakan melalui 属性 instans.
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) -- Tetapkan属性 ke true
humanoid.Health -= 10 -- Kurangi kesehatan pemain
task.wait(RESET_TIME) -- Tunggu durasi reset
part:SetAttribute("Touched", false) -- Atur ulang atribut
end
end
end
part.Touched:Connect(damagePlayer)
Mengaktifkan Suara
Debounce juga berguna saat bekerja dengan efek suara, seperti memutar suara ketika dua bagian bertabrakan ( Touched ) atau memutar suara di acara Activated ketika peng
Untuk menghindari overlay suara, Anda dapat mengurangi menggunakan property IsPlaying dari objek Sound :
Skrip - Bermainkan 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 itu belum bermain
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Skrip - Klik Tombol Bermain Menggunakan Debounce
local button = script.Parent
local function onButtonActivated()
-- Temukan suara anak di tombol
local sound = button:FindFirstChild("Click")
-- Mainkan suara hanya jika itu belum bermain
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)
Efek Penjemputan
Pengalaman sering mencakup pengambilan koleksibel di dunia 3D seperti medkit, paket amunisi, dan banyak lagi. Jika Anda mendesain pickup ini untuk tetap di dunia agar pemain dapat mengambil lagi dan lagi, waktu "cooldown" harus ditambahkan sebelum pickup diperbarui dan direaktifkan kembali.
Mirip dengan mendeteksi tabrakan, Anda dapat mengelola status debounce dengan menggunakan 属性 instans , dan menyimpan periode cooldown dengan mengubah Transparency bagian.
Skrip - Penyembuhan 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) -- Tetapkan属性 ke true
humanoid.Health += 25 -- Tingkatkan kesehatan pemain
part.Transparency = 0.75 -- Buat bagian semi-transparan untuk menunjukkan status cooldown
task.wait(COOLDOWN_TIME) -- Tunggu durasi cooldown
part.Transparency = 0 -- Atur ulang bagian untuk benar-benar opake
part:SetAttribute("CoolingDown", false) -- Atur ulang atribut
end
end
end
part.Touched:Connect(healPlayer)