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 desbúfago evita que una función se ejecute demasiadas veces o que una entrada se active varias veces .Los siguientes escenarios de programación ilustran debounce como una mejor práctica.

Detectar colisiones

Suponga que desea crear una parte de trampa peligrosa que inflige 10 daños cuando se toca.Una implementación inicial podría utilizar una conexión básica BasePart.Touched y una función damagePlayer como esta:

Script - Dañar al jugador

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 -- Reducir la salud del jugador
end
end
part.Touched:Connect(damagePlayer)

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

Para evitar causar daños excesivos en el primer ponerse en contacto/ contactar con, puedes agregar un sistema de debounce que imponga un período de reutilización en los daños a través de un atributo de instancia .

Script - Dañar al jugador usando 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) -- Establecer atributo en verdadero
humanoid.Health -= 10 -- Reducir la salud del jugador
task.wait(RESET_TIME) -- Espere la duración de reinicio
part:SetAttribute("Touched", false) -- Atributo de reinicio
end
end
end
part.Touched:Connect(damagePlayer)

Activar sonidos

Debounce también es útil al trabajar 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 la pantalla.En ambos casos, llamar Sound:Play() inicia 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 sonido, puedes desacelerar usando la propiedad IsPlaying de la objeto Sound:

Script - Reproducir sonido de colisión usando Debounce

local projectile = script.Parent
local function playSound()
-- Encuentra el sonido infantil en la parte
local sound = projectile:FindFirstChild("Impact")
-- Reproduce el sonido solo si no ya está reproduciendo
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Script - Haga clic en el botón de reproducción usando Debounce

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

Efectos de recogida

Las experiencias a menudo incluyen recogidas coleccionables en el mundo 3D como botiquines, paquetes de munición y más.Si diseñas estas recogidas para permanecer en el mundo para que los jugadores las agarren una y otra vez, debe agregarse un tiempo de "enfriamiento" antes de que las recogidas se actualicen y se reactiven.

Al igual que detectar colisiones , puedes gestionar el estado de debounce con un atributo de instancia y visualizar el período de reutilización cambiando la parte de .

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 la salud del jugador
part.Transparency = 0.75 -- Hacer que una parte sea semitransparente para indicar el estado de enfriamiento
task.wait(COOLDOWN_TIME) -- Espere la duración de espera
part.Transparency = 0 -- Restablecer la parte para que sea completamente opaca
part:SetAttribute("CoolingDown", false) -- Atributo de reinicio
end
end
end
part.Touched:Connect(healPlayer)