Wzorce debounce

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Wzór debounce jest techniką kodowania, która zapobiega uruchamianiu funkcji zbyt wiele razy lub uruchamianiu wejścia wielokrotnie.Następujące scenariusze skryptowe ilustrują debounce jako najlepszą praktykę.

Wykryj kolizje

Załóż, że chcesz stworzyć niebezpieczną część pułapki, która zadaje 10 obrażeń, gdy jest dotykana.Początkowa implementacja może wykorzystać podstawowe połączenie BasePart.Touched i funkcję damagePlayer taką jak ta:

Skrypt - Uszkodzenie gracza

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 -- Zmniejsz zdrowie gracza
end
end
part.Touched:Connect(damagePlayer)

Choć na pierwszy rzut oka logiczne, testy pokażą, że wydarzenie Touched uruchamia się wielokrotnie w szybkiej kolejności w oparciu o subtelne kolizje fizyczne.

Aby uniknąć zadawania nadmiernych obrażeń w trakcie pierwszego kontaktować się, możesz dodać system ograniczający czas odnowienia obrażeń poprzez atrybut instancji.

Skrypt - Uszkodzenie gracza za pomocą 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) -- Ustaw atrybut na prawdę
humanoid.Health -= 10 -- Zmniejsz zdrowie gracza
task.wait(RESET_TIME) -- Poczekaj na czas odnowienia
part:SetAttribute("Touched", false) -- Zresetuj atrybut
end
end
end
part.Touched:Connect(damagePlayer)

Włącz dźwięki

Odfiltrowanie jest również przydatne przy pracy z efektami dźwiękowymi, takimi jak odtwarzanie dźwięku, gdy dwie części zderzają się ( Touched ), lub odtwarzanie dźwięku na wydarzeniu Activated , gdy użytkownik interakuje z przyciskiem na ekranie.W obu przypadkach wezwanie Sound:Play() rozpoczyna odtwarzanie od początku jej ścieżki i — bez systemu wygładzania — dźwięk może odtwarzać się wielokrotnie w szybkiej kolejności.

Aby zapobiec zakłóceniu dźwięku, możesz wyeliminować użycie właściwości IsPlaying obiektu Sound:

Skrypt - Odtwarzaj dźwięk kolizji za pomocą Debounce

local projectile = script.Parent
local function playSound()
-- Znajdź dźwięk dziecka na części
local sound = projectile:FindFirstChild("Impact")
-- Odtwarzaj dźwięk tylko wtedy, gdy nie jest już odtwarzany
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Skrypt - kliknięcie przycisku odtwarzania za pomocą Debounce

local button = script.Parent
local function onButtonActivated()
-- Znajdź dźwięk dziecka na przycisku
local sound = button:FindFirstChild("Click")
-- Odtwarzaj dźwięk tylko wtedy, gdy nie jest już odtwarzany
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)

Efekty podniesienia

Doświadczenia często obejmują kolekcjonerskie podniebienia w świecie 3D, takie jak apteczki, paczki amunicji i wiele więcej.Jeśli zaprojektujesz te odbiory, aby pozostały w świecie, by gracze mogli je wciąż i wciąż chwytać, czas "odnowienia" powinien zostać dodany przed odświeżeniem i ponownym aktywowaniem odbioru.

Podobnie jak w przypadku wykrywania kolizji , możesz zarządzać stanem odładowania za pomocą atrybutu instancji i wizualizować okres odnowienia, zmieniając część.

Skrypt - Odbiór zdrowia za pomocą 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) -- Ustaw atrybut na prawdę
humanoid.Health += 25 -- Zwiększ zdrowie gracza
part.Transparency = 0.75 -- Zrób część półprzezroczystą, aby wskazać stan odpoczynku
task.wait(COOLDOWN_TIME) -- Poczekaj na czas odnowienia
part.Transparency = 0 -- Zresetuj część do całkowicie niedostępnej
part:SetAttribute("CoolingDown", false) -- Zresetuj atrybut
end
end
end
part.Touched:Connect(healPlayer)