A debounce deseni, bir fonksiyonun çok fazla kez çalışmasını veya bir girdinin birden fazla kez tetiklenmesini engelleyen bir kodlama tekniğidir. Aşağıdaki betik senaryoları, debouncenin en iyi uygulama olarak nasıl kullanılacağını gösterir.
Çarpışmaları tespit etme
Varsayalım ki, dokunulduğunda 10 hasar veren tehlikeli bir tuzak parçası oluşturmak istiyorsunuz. İlk uygulama, basit bir BasePart.Touched bağlantısı ve şöyle bir damagePlayer fonksiyonu kullanabilir:
Script - Hasar Verme
local part = script.Parent
local function damagePlayer(otherPart)
print(part.Name .. " ile " .. otherPart.Name .. " çarpıştı")
local humanoid = otherPart.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health -= 10 -- Oyuncunun sağlığını azalt
end
end
part.Touched:Connect(damagePlayer)
İlk bakışta mantıklı görünüyor olsa da, test etme, Touched olayının ince fiziksel çarpışmalara dayalı olarak hızlı bir şekilde birden fazla kez ateş ettiğini gösterecektir.

İlk temasta aşırı hasar vermekten kaçınmak için, hasarın bir örnek niteliği üzerinden bir bekleme süresi zorunlu kılan bir debounce sistemi ekleyebilirsiniz.
Script - Debounce Kullanarak Hasar Verme
local part = script.Parent
local RESET_TIME = 1
local function damagePlayer(otherPart)
print(part.Name .. " ile " .. otherPart.Name .. " çarpıştı")
local humanoid = otherPart.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
if not part:GetAttribute("Touched") then
part:SetAttribute("Touched", true) -- Nitelik değerini true olarak ayarla
humanoid.Health -= 10 -- Oyuncunun sağlığını azalt
task.wait(RESET_TIME) -- Sıfırlama süresince bekle
part:SetAttribute("Touched", false) -- Niteliği sıfırla
end
end
end
part.Touched:Connect(damagePlayer)
Sesleri tetikleme
Debounce, ses efektleri ile çalışırken de yararlıdır. Örneğin, iki parça çarpıştığında bir ses çalmak (Touched) veya bir kullanıcı ekrandaki bir düğmeye etkileşimde bulunduğunda Activated olayında bir ses çalmak için kullanılabilir. Her iki durumda da, Sound:Play() çağrısı, parça başlangıcından çalma işlemini başlatır ve — bir debounce sistemi olmadan — ses, hızlı bir şekilde birden fazla kez çalabilir.
Ses üst üste gelmelerini önlemek için, Sound nesnesinin IsPlaying niteliğini kullanarak debounce yapabilirsiniz:
Script - Debounce Kullanarak Çarpışma Sesi Çalma
local projectile = script.Parent
local function playSound()
-- Parçada bulunan ses nesnesini bul
local sound = projectile:FindFirstChild("Impact")
-- Ses zaten çalmıyorsa çal
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Script - Debounce Kullanarak Düğme Tıklama Sesi Çalma
local button = script.Parent
local function onButtonActivated()
-- Düğmede bulunan ses nesnesini bul
local sound = button:FindFirstChild("Click")
-- Ses zaten çalmıyorsa çal
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)
Toplama efektleri
Oyunlar genellikle 3D dünyada medkitler, mermi paketleri ve daha fazlası gibi toplanabilir nesneleri içerir. Eğer bu toplama nesnelerini oyuncuların tekrar tekrar alabileceği şekilde tasarlıyorsanız, toplama yeniden etkinleşmeden önce bir "bekleme" süresi eklenmelidir.
Çarpışmaları tespit etme ile benzer şekilde, debounce durumunu bir örnek niteliği ile yönetebilir ve bekleme süresini parça üzerindeki Transparency niteliğini değiştirerek görselleştirebilirsiniz.
Script - Debounce Kullanarak Sağlık Alımı
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) -- Nitelik değerini true olarak ayarla
humanoid.Health += 25 -- Oyuncunun sağlığını artır
part.Transparency = 0.75 -- Bekleme durumunu göstermek için parçayı yarı saydam yap
task.wait(COOLDOWN_TIME) -- Bekleme süresince bekle
part.Transparency = 0 -- Parçayı tamamen opak hale getir
part:SetAttribute("CoolingDown", false) -- Niteliği sıfırla
end
end
end
part.Touched:Connect(healPlayer)