Ein Debounce -Muster ist eine Codiertechnik, die verhindert, dass eine Funktion zu oft ausgeführt wird oder ein Eingabe mehrfach ausgelöst wird.Die folgenden Skript-Szenarien illustrieren Debounce als beste Praxis.
Kollisionen erkennen
Angenommen, du möchtest ein gefährliches Fallteil erstellen, das 10 Schaden verursacht, wenn es berührt wird.Eine erste Implementierung könnte eine grundlegende BasePart.Touched Verbindung und eine damagePlayer Funktion wie diese verwenden:
Skript - Schadensspieler
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 -- Spielergesundheit reduzieren
end
end
part.Touched:Connect(damagePlayer)
Während auf den ersten Blick logisch, wird das Testen zeigen, dass das Ereignis Touched mehrere Male in rascher Folge auf der Grundlage subtiler physischer Kollisionen feuert.

Um übermäßigen Schaden durch den ersten kontaktierenzu vermeiden, kannst du ein Debounce-System hinzufügen, das eine Abklingzeit für Schaden durch eine Instanzattribut auferlegt.
Skript - Schaden des Spielers mit Debounce verwenden
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) -- Attribut auf wahr setzen
humanoid.Health -= 10 -- Spielergesundheit reduzieren
task.wait(RESET_TIME) -- Warte auf die Wiederherstellungszeit
part:SetAttribute("Touched", false) -- Attribut zurücksetzen
end
end
end
part.Touched:Connect(damagePlayer)
Auslösegeräusche
Debounce ist auch nützlich, wenn du mit Soundeffekten arbeitest, z. B. wenn du einen Ton abspielst, wenn zwei Teile kollidieren ( Touched ), oder einen Ton auf dem Activated-Ereignis abspielst, wenn ein Benutzer mit einem auf-Bildschirm-Button interagiert.In beiden Fällen beginnt das Abspielen von Sound:Play() von Beginn seiner Spur und - ohne ein Debounce-System - kann der Klang mehrere Male in kurzer Folge abgespielt werden.
Um ein Überschneiden von Ton zu verhindern, kannst du mit der Eigenschaft IsPlaying des Sound Objekts debounce:
Skript - Spielen von Kollisionsgeräuschen mit Debounce
local projectile = script.Parent
local function playSound()
-- Finde Kindersound auf der Seite
local sound = projectile:FindFirstChild("Impact")
-- Spiele den Ton nur ab, wenn er noch nicht abgespielt wird
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Skript - Spiel-Button-Klick mit Debounce verwenden
local button = script.Parent
local function onButtonActivated()
-- Finde Kindersound auf der Schaltfläche
local sound = button:FindFirstChild("Click")
-- Spiele den Ton nur ab, wenn er noch nicht abgespielt wird
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)
Abhol-Effekte
Erlebnisse enthalten oft Sammelstücke in der 3D-Welt wie Medikamente, Munitionspakete und mehr.Wenn du diese Abholungen so gestaltest, dass sie in der Welt bleiben, um von Spielern immer wieder abgegriffen zu werden, sollte eine "Abklingzeit" hinzugefügt werden, bevor die Abholung aktualisiert und wieder aktiviert wird.
Ähnlich wie bei der Erkennung von Kollisionen kannst du den Debounce-Zustand mit einem Instanzattribut verwalten und die Abklingzeit visualisieren, indem du das Teil änderst .
Skript - Gesundheitsabholung mit 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) -- Attribut auf wahr setzen
humanoid.Health += 25 -- Erhöhe die Spielergesundheit
part.Transparency = 0.75 -- Mache das Teil teilweise durchsichtig, um den Abklingzustand anzuzeigen
task.wait(COOLDOWN_TIME) -- Warte auf Abklingzeitdauer
part.Transparency = 0 -- Teil vollständig opak zurücksetzen
part:SetAttribute("CoolingDown", false) -- Attribut zurücksetzen
end
end
end
part.Touched:Connect(healPlayer)