Modelli di debounce

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

Un modello A debounce è una tecnica di codifica che impedisce a una funzione di essere eseguita troppe volte o a un input di essere attivato più volte.Gli scenari di scripting seguenti illustrano debounce come migliore pratica.

Rileva le collisioni

Supponiamo che tu voglia creare una parte di trappola pericolosa che infligge 10 danni quando viene toccata.Un'implementazione iniziale potrebbe utilizzare una connessione di base BasePart.Touched e una funzione damagePlayer come questa:

Script - Danni al giocatore

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 -- Riduci la salute del giocatore
end
end
part.Touched:Connect(damagePlayer)

Mentre logico a prima vista, i test mostreranno che l'evento Touched si attiva più volte in rapida successione in base a sottili collisioni fisiche.

Per evitare di causare danni eccessivi durante il primo Contattare, puoi aggiungere un sistema di debounce che impone un periodo di recupero sul danno attraverso un attributo istanza.

Script - Danni al giocatore utilizzando 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) -- Imposta l'attributo a vero
humanoid.Health -= 10 -- Riduci la salute del giocatore
task.wait(RESET_TIME) -- Attendi la durata di reset
part:SetAttribute("Touched", false) -- Ripristina l'attributo
end
end
end
part.Touched:Connect(damagePlayer)

Attiva i suoni

Debounce è utile anche quando si lavora con effetti sonori, come riprodurre un suono quando due parti si scontrano ( Touched ), o riprodurre un suono sull'evento Activated quando un utente interagisce con un pulsante sullo schermo.In entrambi i casi, chiamare Sound:Play() avvia il riproduzione dall'inizio della sua traccia e - senza un sistema di debounce - il suono può essere riprodotto più volte in rapida successione.

Per prevenire l'interposizione del suono, puoi debounce utilizzando la proprietà IsPlaying dell'oggetto Sound:

Script - Riproduci il suono di collisione utilizzando Debounce

local projectile = script.Parent
local function playSound()
-- Trova il suono del figlio sulla parte
local sound = projectile:FindFirstChild("Impact")
-- Riproduci il suono solo se non sta già suonando
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Script - Click del pulsante di riproduzione utilizzando Debounce

local button = script.Parent
local function onButtonActivated()
-- Trova il suono del bambino sul pulsante
local sound = button:FindFirstChild("Click")
-- Riproduci il suono solo se non sta già suonando
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)

Effetti di ritiro

Le esperienze spesso includono raccolte di oggetti da collezione nel mondo 3D come kit medici, pacchi di munizioni e altro ancora.Se progetti questi pickup per rimanere nel mondo per i giocatori che li afferrano ancora e ancora, dovrebbe essere aggiunto un tempo di "ricarica" prima che il pickup si aggiorna e si riattivi.

Simile a rilevare le collisioni, puoi gestire lo stato di debounce con un attributo di istanza e visualizzare il periodo di recupero cambiando la parte di Transparency.

Script - Raccogliere la salute utilizzando 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) -- Imposta l'attributo a vero
humanoid.Health += 25 -- Aumenta la salute del giocatore
part.Transparency = 0.75 -- Rendi la parte semi-trasparente per indicare lo stato di recupero
task.wait(COOLDOWN_TIME) -- Aspetta la durata del cooldown
part.Transparency = 0 -- Ripristina la parte completamente opaca
part:SetAttribute("CoolingDown", false) -- Ripristina l'attributo
end
end
end
part.Touched:Connect(healPlayer)