Ein Debounce-Muster ist eine Codierungs技ik, die verhindert, dass eine Funktion zu oft ausgeführt wird oder ein Eingabe mehrmals ausgelöst wird. Die folgenden Skript-Szenarien zeigen Debounce als Best Practise.
Kollisionen erkennen
Stellen Sie vor, Sie möchten einen gefährlichen Teil erstellen, der 10 Schaden verursacht, wenn er berührt wird. Eine frühe Umsetzung verwendet eine grundlegende Verbindung BasePart.Touched und eine damagePlayer -Funktion wie diese:
Script - Schaden Spieler
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 -- Reduzieren Sie die Gesundheit des Spielers
end
end
part.Touched:Connect(damagePlayer)
Während logisch auf den ersten Blick, wird das Testen zeigen, dass das Ereignis Touched mehrere Male in rascher Abfolge basierend auf subtilen physischen Kollisionen feuert.
Um überschüssigen Schaden beim ersten kontaktierenzu vermeiden, kannst du ein Debounce-System hinzufügen, das eine Abklingzeit für Schaden durch einen Instanz-Attribut-Tree festlegt.
Script - Schaden Spieler mit 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) -- Attribut auf "wahr" setzen
humanoid.Health -= 10 -- Reduzieren Sie die Gesundheit des Spielers
task.wait(RESET_TIME) -- Warte auf die Rücksetzungszeit
part:SetAttribute("Touched", false) -- Attribut zurücksetzen
end
end
end
part.Touched:Connect(damagePlayer)
Ausgelöste Sounds
Debounce ist auch nützlich, wenn Sie mit Soundeffekten arbeiten, z. B. wenn Sie einen Sound abspielen, wenn zwei Teile kollidieren ( Class.BasePart.Touched|Touched) oder wenn Sie ein Sound auf dem Class.GuiButton.Activated|Activated -Ereignis abspielen, wenn ein Benutzer mit einem
Um Sound-Overlays zu verhindern, kannst du mit der Eigenschaft IsPlaying des Objekts Sound abprallen:
Script - Play Collision Sound Mit Debounce
local projectile = script.Parent
local function playSound()
-- Finde Kindersound auf der Teil
local sound = projectile:FindFirstChild("Impact")
-- Spiele den Sound nur, wenn er noch nicht abgespielt wird
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Script - Play Button Klicken mit Debounce
local button = script.Parent
local function onButtonActivated()
-- Finde Kindersound auf der Schaltfläche
local sound = button:FindFirstChild("Click")
-- Spiele den Sound nur, wenn er noch nicht abgespielt wird
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)
Effekte abholen
Erlebnisse enthalten oft sammelbare Pickups in der 3D-Welt, wie z. B. Medkits, Munitionspacks und mehr. Wenn Sie diese Pickups so konzeptionieren, dass sie in der Welt für Spieler wieder und wieder erneut genommen werden können, sollte eine "Abklingzeit"-Zeit hinzugefügt werden, bevor das Pickup aktualisiert und wiederaktiviert wird.
Ganz ähnlich wie Kollisionen erkennen , kannst du den Debounce-Status mit einem Instanz-Attribut verwalten und die Abklingzeitperiode visualisieren, indem du die Class.BasePart.Transparency|Transparency des Teils änderst.
Script - Gesundheits-Pickup 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öhen Sie die Gesundheit des Spielers
part.Transparency = 0.75 -- Macht das Teil halbtransparent, um den Kühle-Wartungs-Status anzuzeigen
task.wait(COOLDOWN_TIME) -- Warte auf die Abklingzeitdauer
part.Transparency = 0 -- Teil so lagerungskonform wie möglich
part:SetAttribute("CoolingDown", false) -- Attribut zurücksetzen
end
end
end
part.Touched:Connect(healPlayer)