Modelli di debounce

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

Un modello di debounce è una tecnica di codifica che impedisce a una funzione di essere eseguita troppe volte o a un input di attivarsi più volte. I seguenti scenari di scripting illustrano il debounce come una best practice.

Rilevare collisioni

Supponiamo di voler creare una parte 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 - Danno al Giocatore

local part = script.Parent
local function damagePlayer(otherPart)
print(part.Name .. " è entrato in collisione con " .. 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)

Sebbene sia logico a prima vista, i test mostreranno che l'evento Touched scatta più volte in rapida successione a causa di sottili collisioni fisiche.

Per evitare di infliggere danni eccessivi al contatto iniziale, puoi aggiungere un sistema di debounce che impone un periodo di raffreddamento sui danni attraverso un attributo di istanza.

Script - Danno al Giocatore Utilizzando il Debounce

local part = script.Parent
local RESET_TIME = 1
local function damagePlayer(otherPart)
print(part.Name .. " è entrato in collisione con " .. otherPart.Name)
local humanoid = otherPart.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
if not part:GetAttribute("Touched") then
part:SetAttribute("Touched", true) -- Imposta l'attributo su true
humanoid.Health -= 10 -- Riduci la salute del giocatore
task.wait(RESET_TIME) -- Attendi la durata di reset
part:SetAttribute("Touched", false) -- Resetta l'attributo
end
end
end
part.Touched:Connect(damagePlayer)

Attivare suoni

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

Per prevenire sovrapposizioni di suoni, puoi utilizzare il debounce tramite la proprietà IsPlaying dell'oggetto Sound:

Script - Riproduci Suono di Collisione Utilizzando il Debounce

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

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

Effetti di pickup

I giochi spesso includono pickup collezionabili nel mondo 3D, come medikit, pacchetti di munizioni e altro. Se progetti questi pickup per rimanere nel mondo affinché i giocatori possano prenderli di nuovo e di nuovo, dovrebbe essere aggiunto un tempo di "raffreddamento" prima che il pickup si aggiorni e riattivi.

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

Script - Pickup Salute Utilizzando il 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 su true
humanoid.Health += 25 -- Aumenta la salute del giocatore
part.Transparency = 0.75 -- Rendi la parte semi-trasparente per indicare lo stato di cooldown
task.wait(COOLDOWN_TIME) -- Attendi la durata di cooldown
part.Transparency = 0 -- Ripristina la parte a completamente opaca
part:SetAttribute("CoolingDown", false) -- Resetta l'attributo
end
end
end
part.Touched:Connect(healPlayer)
© 2026 Roblox Corporation. Roblox, il logo Roblox e Powering Imagination sono tra i nostri marchi registrati e non registrati negli Stati Uniti. e altri paesi.