Wzorce opóźnienia

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

Wzorzec opóźnienia to technika kodowania, która zapobiega zbyt częstemu wywoływaniu funkcji lub powtarzaniu się zdarzenia wejściowego. Następujące scenariusze skryptowe ilustrują opóźnienie jako najlepszą praktykę.

Wykrywanie kolizji

Załóżmy, że chcesz stworzyć niebezpieczną pułapkę, która zadaje 10 punktów obrażeń po kontakcie. Początkowa implementacja może wykorzystywać podstawowe połączenie BasePart.Touched oraz funkcję damagePlayer w następujący sposób:

Skrypt - Szkodzenie graczowi

local part = script.Parent
local function damagePlayer(otherPart)
print(part.Name .. " koliduje z " .. otherPart.Name)
local humanoid = otherPart.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health -= 10 -- Zmniejsz zdrowie gracza
end
end
part.Touched:Connect(damagePlayer)

Mimo że na pierwszy rzut oka wydaje się to logiczne, testowanie pokaże, że zdarzenie Touched wyzwala się wielokrotnie w szybkim następstwie z powodu subtelnych kolizji fizycznych.

Aby uniknąć zadawania nadmiernych obrażeń przy pierwszym kontakcie, możesz dodać system opóźnienia, który wymusza czas odnowienia na zadawanie obrażeń przez atrybut instancji.

Skrypt - Szkodzenie graczowi z użyciem opóźnienia

local part = script.Parent
local RESET_TIME = 1
local function damagePlayer(otherPart)
print(part.Name .. " koliduje z " .. otherPart.Name)
local humanoid = otherPart.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
if not part:GetAttribute("Touched") then
part:SetAttribute("Touched", true) -- Ustaw atrybut na true
humanoid.Health -= 10 -- Zmniejsz zdrowie gracza
task.wait(RESET_TIME) -- Czeka na czas resetu
part:SetAttribute("Touched", false) -- Resetuj atrybut
end
end
end
part.Touched:Connect(damagePlayer)

Wyzwalanie dźwięków

Opóźnienie jest również przydatne przy pracy z efektami dźwiękowymi, takimi jak odtwarzanie dźwięku, gdy dwie części kolidują (Touched), lub odtwarzanie dźwięku przy zdarzeniu Activated, gdy użytkownik wchodzi w interakcję z przyciskiem na ekranie. W obu przypadkach wywołanie Sound:Play() rozpoczyna odtwarzanie od początku utworu i — bez systemu opóźnienia — dźwięk może być odtwarzany wielokrotnie w szybkim następstwie.

Aby zapobiec nakładaniu się dźwięków, możesz użyć opóźnienia z właściwością IsPlaying obiektu Sound:

Skrypt - Odtwarzanie dźwięku kolizji z użyciem opóźnienia

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, jeśli nie jest już odtwarzany
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Skrypt - Odtwarzanie dźwięku kliknięcia przycisku z użyciem opóźnienia

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

Efekty podnoszenia

Gry często zawierają kolekcjonowane przedmioty w wirtualnym świecie, takie jak apteczki, pakiety amunicji i inne. Jeśli zaprojektujesz te przedmioty, aby pozostawały w świecie, aby gracze mogli je zbierać raz po raz, powinien być dodany czas "odnowienia" przed odnowieniem i reaktywacją przedmiotu.

Podobnie jak w przypadku wykrywania kolizji, możesz zarządzać stanem opóźnienia za pomocą atrybutu instancji i zobrazować czas odnowienia, zmieniając przezroczystość Transparency części.

Skrypt - Podniesienie zdrowia z użyciem opóźnienia

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 true
humanoid.Health += 25 -- Zwiększ zdrowie gracza
part.Transparency = 0.75 -- Uczyń część półprzezroczystą, aby wskazać stan odnowienia
task.wait(COOLDOWN_TIME) -- Czekaj na czas odnowienia
part.Transparency = 0 -- Resetuj część do całkowicie nieprzezroczystej
part:SetAttribute("CoolingDown", false) -- Resetuj atrybut
end
end
end
part.Touched:Connect(healPlayer)
©2026 Roblox Corporation. Nazwa Roblox, logo Roblox oraz hasło „Powering Imagination” należą do naszych zarejestrowanych i niezarejestrowanych znaków towarowych na terenie Stanów Zjednoczonych oraz w innych krajach.