Patrones de Debounce

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

Un patrón de debounce es una técnica de codificación que evita que una función se ejecute demasiadas veces o que una entrada dispare múltiples veces. Los siguientes escenarios de scripting ilustran el debounce como una buena práctica.

Detectar colisiones

Supongamos que deseas crear una parte de trampa peligrosa que inflige 10 puntos de daño al ser tocada. Una implementación inicial podría utilizar una conexión básica de BasePart.Touched y una función damagePlayer como esta:

Script - Daño al Jugador

local part = script.Parent
local function damagePlayer(otherPart)
print(part.Name .. " colisionó con " .. otherPart.Name)
local humanoid = otherPart.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health -= 10 -- Reducir salud del jugador
end
end
part.Touched:Connect(damagePlayer)

Aunque es lógico a primera vista, las pruebas mostrarán que el evento Touched se dispara múltiples veces en rápida sucesión basado en colisiones físicas sutiles.

Para evitar causar daño excesivo en el contacto inicial, puedes agregar un sistema de debounce que imponga un período de enfriamiento en el daño a través de un atributo de instancia.

Script - Daño al Jugador Usando Debounce

local part = script.Parent
local RESET_TIME = 1
local function damagePlayer(otherPart)
print(part.Name .. " colisionó con " .. otherPart.Name)
local humanoid = otherPart.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
if not part:GetAttribute("Touched") then
part:SetAttribute("Touched", true) -- Establecer atributo en verdadero
humanoid.Health -= 10 -- Reducir salud del jugador
task.wait(RESET_TIME) -- Esperar el tiempo de reinicio
part:SetAttribute("Touched", false) -- Reiniciar atributo
end
end
end
part.Touched:Connect(damagePlayer)

Activar sonidos

El debounce también es útil cuando se trabaja con efectos de sonido, como reproducir un sonido cuando dos partes colisionan (Touched), o reproducir un sonido en el evento Activated cuando un usuario interactúa con un botón en pantalla. En ambos casos, llamar a Sound:Play() comienza la reproducción desde el principio de su pista y — sin un sistema de debounce — el sonido puede reproducirse múltiples veces en rápida sucesión.

Para evitar la superposición de sonidos, puedes usar debounce con la propiedad IsPlaying del objeto Sound:

Script - Reproducir Sonido de Colisión Usando Debounce

local projectile = script.Parent
local function playSound()
-- Encontrar sonido hijo en la parte
local sound = projectile:FindFirstChild("Impact")
-- Reproducir el sonido solo si no se está reproduciendo
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Script - Reproducir Sonido de Clic en Botón Usando Debounce

local button = script.Parent
local function onButtonActivated()
-- Encontrar sonido hijo en el botón
local sound = button:FindFirstChild("Click")
-- Reproducir el sonido solo si no se está reproduciendo
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)

Efectos de recogida

Los juegos a menudo incluyen recolectables en el mundo 3D, como botiquines, paquetes de munición y más. Si diseñas estas recogidas para que permanezcan en el mundo para que los jugadores las agarren una y otra vez, se debe agregar un tiempo de "enfriamiento" antes de que la recogida se refresque y reactive.

De manera similar a detectar colisiones, puedes manejar el estado de debounce con un atributo de instancia, y visualizar el período de enfriamiento cambiando la Transparency de la parte.

Script - Recogida de Salud Usando 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) -- Establecer atributo en verdadero
humanoid.Health += 25 -- Aumentar salud del jugador
part.Transparency = 0.75 -- Hacer que la parte sea semi-transparente para indicar el estado de enfriamiento
task.wait(COOLDOWN_TIME) -- Esperar duración de enfriamiento
part.Transparency = 0 -- Reiniciar parte a completamente opaca
part:SetAttribute("CoolingDown", false) -- Reiniciar atributo
end
end
end
part.Touched:Connect(healPlayer)
©2026 Roblox Corporation. Roblox, el logotipo de Roblox y "Powering Imagination" son algunas de nuestras marcas registradas y no registradas en los Estados Unidos y otros países.