Debounce-Muster

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

Ein Debounce-Muster ist eine Programmiertechnik, die verhindert, dass eine Funktion zu oft aufgerufen wird oder dass eine Eingabe mehrmals ausgelöst wird. Die folgenden Skript-Szenarien veranschaulichen Debounce als bewährte Praxis.

Kollisionen erkennen

Nehmen wir an, Sie möchten ein gefährliches Fallelement erstellen, das 10 Schaden verursacht, wenn es berührt wird. Eine erste Implementierung könnte eine einfache BasePart.Touched-Verbindung und eine damagePlayer-Funktion wie folgt verwenden:

Script - Spieler Schaden zufügen

local part = script.Parent
local function damagePlayer(otherPart)
print(part.Name .. " kollidierte mit " .. otherPart.Name)
local humanoid = otherPart.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health -= 10 -- Spieler-Gesundheit reduzieren
end
end
part.Touched:Connect(damagePlayer)

Obwohl es auf den ersten Blick logisch erscheint, wird beim Testen gezeigt, dass das Touched-Ereignis mehrfach in schneller Folge aufgrund subtiler physikalischer Kollisionen ausgelöst wird.

Um übermäßigen Schaden beim ersten Kontakt zu vermeiden, können Sie ein Debounce-System hinzufügen, das eine Abkühlzeit beim Schaden durch ein Instanzattribut durchsetzt.

Script - Spieler Schaden mit Debounce zufügen

local part = script.Parent
local RESET_TIME = 1
local function damagePlayer(otherPart)
print(part.Name .. " kollidierte mit " .. otherPart.Name)
local humanoid = otherPart.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
if not part:GetAttribute("Touched") then
part:SetAttribute("Touched", true) -- Attribut auf true setzen
humanoid.Health -= 10 -- Spieler-Gesundheit reduzieren
task.wait(RESET_TIME) -- Wartezeit für den Rücksetzbetrag
part:SetAttribute("Touched", false) -- Attribut zurücksetzen
end
end
end
part.Touched:Connect(damagePlayer)

Geräusche auslösen

Debounce ist auch nützlich, wenn man mit Soundeffekten arbeitet, wie z.B. das Abspielen eines Sounds, wenn zwei Teile kollidieren (Touched), oder das Abspielen eines Sounds beim Activated-Ereignis, wenn ein Benutzer mit einem Bildschirmknopf interagiert. In beiden Fällen startet der Aufruf von Sound:Play() die Wiedergabe von Anfang an und — ohne ein Debounce-System — könnte der Sound mehrfach in schneller Folge abgespielt werden.

Um ein Überlappen der Sounds zu verhindern, können Sie Debounce mithilfe der IsPlaying-Eigenschaft des Sound-Objekts verwenden:

Script - Kollisionsgeräusch mit Debounce abspielen

local projectile = script.Parent
local function playSound()
-- Kind-Geräusch im Teil finden
local sound = projectile:FindFirstChild("Impact")
-- Den Sound nur abspielen, wenn er noch nicht abgespielt wird
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Script - Knopf-Klick mit Debounce abspielen

local button = script.Parent
local function onButtonActivated()
-- Kind-Geräusch im Knopf finden
local sound = button:FindFirstChild("Click")
-- Den Sound nur abspielen, wenn er noch nicht abgespielt wird
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)

Abhol-Effekte

Spiele enthalten oft sammelbare Objekte in der 3D-Welt, wie Medipacks, Munitionspakete und mehr. Wenn Sie diese Abholgegenstände so gestalten, dass sie in der Welt verbleiben, damit die Spieler sie immer wieder aufheben können, sollte eine "Abkühlzeit" hinzugefügt werden, bevor der Abholgegenstand wiederauffrischt und reaktiviert wird.

Ähnlich wie beim Erkennen von Kollisionen können Sie den Debounce-Zustand mit einem Instanzattribut verwalten und die Abkühlzeit visualisieren, indem Sie die Transparency des Teils ändern.

Script - 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 true setzen
humanoid.Health += 25 -- Spieler-Gesundheit erhöhen
part.Transparency = 0.75 -- Teil halbtransparent machen, um den Abkühlzustand anzuzeigen
task.wait(COOLDOWN_TIME) -- Wartezeit für den Abkühlzeitraum
part.Transparency = 0 -- Teil wieder voll opak machen
part:SetAttribute("CoolingDown", false) -- Attribut zurücksetzen
end
end
end
part.Touched:Connect(healPlayer)
©2026 Roblox Corporation. Roblox, das Roblox-Logo und "Powering Imagination" gehören zu unseren eingetragenen und nicht eingetragenen Markenzeichen in den USA und anderen Ländern.