Bir debounce modeli, bir işlevin çok kez çalışmasını veya bir girişin birden fazla kez tetiklenmesini engelleyen bir kodlama tekniğidir.Aşağıdaki senaryolar, debounce'u en iyi uygulama olarak gösterir.
Çarpışmaları algıla
Dokunulduğunda 10 hasar veren tehlikeli bir tuzak parçası oluşturmak istediğinizi varsayalım.Bir başlangıç implementasyonu temel bir BasePart.Touched bağlantı ve bunun gibi bir damagePlayer fonksiyon kullanabilir:
Senaryo - Hasar Oyuncusu
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 -- Oyuncu sağlığını azalt
end
end
part.Touched:Connect(damagePlayer)
İlk bakışta mantıklı olsa da, test Touched etkinliğinin ince fiziksel çarpışmalara dayanarak hızlı bir şekilde birden fazla kez ateş edeceğini gösterecektir.

İlk iletişimsırasında aşırı hasara neden olmaktan kaçınmak için, bir instans özniteliği üzerinden hasara bir bekleme süresi uygulayan bir debounce sistemi ekleyebilirsiniz.
Senaryo - Debounce Kullanarak Hasar Oyuncusu
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) -- Özniteliği doğru olarak ayarla
humanoid.Health -= 10 -- Oyuncu sağlığını azalt
task.wait(RESET_TIME) -- Sıfırlama süresini bekleyin
part:SetAttribute("Touched", false) -- Özelliği sıfırla
end
end
end
part.Touched:Connect(damagePlayer)
Tetik sesler
Debounce, ses efektleriyle çalışırken de yararlıdır, örneğin iki parça çarpıştığında bir ses çalmak ( Touched ), veya bir kullanıcı ekranda bir düğmeyle etkileşim kurduğunda Activated etkinliğinde bir ses çalmak.Her iki durumda da, Sound:Play() 'yi aramak parçasının başından itibaren oynatmayı başlatır ve debounce sistemi olmadan ses hızlı bir şekilde birden fazla kez oynayabilir.
Ses çakışmasını önlemek için, IsPlaying nesnenin Sound özelliğini kullanarak debounce yapabilirsiniz:
Script - Debounce Kullanarak Çarpışma Sesi Oynat
local projectile = script.Parent
local function playSound()
-- Parçada çocuk ses bul
local sound = projectile:FindFirstChild("Impact")
-- Sesi yalnızca çalmıyorsa oynatın
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Script - Oynatma Düğmesi Debounce Kullanarak Tıklama
local button = script.Parent
local function onButtonActivated()
-- Butondaki çocuk sesini bul
local sound = button:FindFirstChild("Click")
-- Sesi yalnızca çalmıyorsa oynatın
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)
Toplama efektleri
Deneyimler genellikle 3B dünyada koleksiyon parçalarını içerir, örneğin medkitler, mühimmat paketleri ve daha fazlası.Bu alımları oyuncuların tekrar tekrar yakalayabilmeleri için dünyada kalması için tasarlarsanız, alım yenilenmesi ve yeniden etkinleştirilmesinden önce bir "bekleme" süresi eklenmelidir.
çarpışma algılamaya benzer şekilde , debounce durumunu bir nesne özniteliği ile yönetebilir ve parçanın süresini değiştirerek soğuma süresini görselleştirebilirsiniz.
Script - Debounce Kullanarak Sağlık Alma
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) -- Özniteliği doğru olarak ayarla
humanoid.Health += 25 -- Oyuncu sağlığını artır
part.Transparency = 0.75 -- Bekleme durumunu göstermek için parçayı yarı saydam hale getir
task.wait(COOLDOWN_TIME) -- Bekleme süresi için bekle
part.Transparency = 0 -- Parçayı tamamen opak hale sıfırla
part:SetAttribute("CoolingDown", false) -- Özelliği sıfırla
end
end
end
part.Touched:Connect(healPlayer)