Wzory odpuszczenia

*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.

Pattern debounce to technika kodowania, która zapobiega wykonaniu funkcji zbyt wiele razy lub włączeniu wielu razy wejścia. Poniższe przykłady skryptów ilustrują debounce jako najlepszą praktykę.

Wykrywanie kolizji

Załóżmy, że chcesz stworzyć część niebezpiecznego pułapu, która zadaje 10 obrażeń, gdy dotykana. Pierwsza implementacja może użyć podstawowego połączenia BasePart.Touched i funkcji damagePlayer takiej 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 -- Redukuj zdrowie gracza
end
end
part.Touched:Connect(damagePlayer)

Podczas gdy na pierwszy rzut oka logiczny, test pokaże, że wydarzenie Touched wyzwala wiele razy szybko w kolejności zależnej od subtelnych kolizji fizycznych.

Aby uniknąć zbyt dużego obrażenia przy pierwszej kontaktować się, możesz dodać system odwracania, który zapewnia okres regeneracji na obrażenia poprzez przypis instancji.

Skrypt - Uszkodzenie gracza używając 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 -- Redukuj zdrowie gracza
task.wait(RESET_TIME) -- Poczekaj na czas odnowienia
part:SetAttribute("Touched", false) -- Zresetuj atrybut
end
end
end
part.Touched:Connect(damagePlayer)

Dźwiękowe Uruchamianie

Odwrócona również przydatna podczas pracy z efektami dźwięku, takimi jak odtwarzanie dźwięku, gdy dwa części zderzają się ( Touched ) lub odtwarzanie dźwięku na wydarzeniu Class.GuiButton.Activated|Activated

Aby zapobiec zniekształceniu dźwięku, możesz użyć właściwości IsPlaying obiektu Sound do odskoczowania:

Skrypt - Włącz dźwięk kolidyjny przy użyciu Debounce

local projectile = script.Parent
local function playSound()
-- Znajdź dziecięcy dźwięk na części
local sound = projectile:FindFirstChild("Impact")
-- Graj dźwięk tylko jeśli nie gra już
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Skrypt - Kliknij przycisk Play używając Debounce

local button = script.Parent
local function onButtonActivated()
-- Znajdź dziecięcy dźwięk na przycisku
local sound = button:FindFirstChild("Click")
-- Graj dźwięk tylko jeśli nie gra już
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)

Efekty podnoszenia

Doświadczenia często zawierają zbieralne podniesienia w świecie 3D, takie jak apteczki, paczki amunicji i wiele więcej. Jeśli zaprojektujesz te podniesienia, aby pozostać w świecie, aby gracze mogli zbierać je ponownie i ponownie, czas odnowienia powinien być dodany przed odświeżeniem i ponownym aktywowaniem.

Podobnie jak wykrywanie kolizji, możesz zarządzać stanem odwrócenia z użyciem atrybutu instancji i wizualizować okres odwrócenia poprzez zmianę stanu Transparency .

Skrypt - Obsługa zdrowia przy użyciu 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 -- Począść półprzezroczysty, aby wskazać stan odliczania
task.wait(COOLDOWN_TIME) -- Poczekaj na czas odnowienia
part.Transparency = 0 -- Zresetuj część, aby całkowicie zaciemnić
part:SetAttribute("CoolingDown", false) -- Zresetuj atrybut
end
end
end
part.Touched:Connect(healPlayer)