Patrones de desvío

*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 se activa demasiadas veces. Los siguientes escenarios de script ilustran el debounce como mejor práctica.

Detectando colisiones

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

Script - Dañar 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, la prueba mostrará que el evento Touched activa múltiples veces en rápida sucesión según colisiones físicas sutiles.

Para evitar causar daño excesivo en el ponerse en contacto/ contactar coninicial, puede agregar un sistema de debounce que implica un período de tiempo de reutilización 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 .. " 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 a verdadero
humanoid.Health -= 10 -- Reducir la salud del jugador
task.wait(RESET_TIME) -- Espera a que la duración de reinicio
part:SetAttribute("Touched", false) -- Restablecer atributo
end
end
end
part.Touched:Connect(damagePlayer)

Activando Sonidos

El desvío 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 la pantalla. En

Para evitar el error de sonido, puede desviar el rebote usando la propiedad IsPlaying del objeto Sound :

Script - Reproducir el sonido de colisión usando Debounce

local projectile = script.Parent
local function playSound()
-- Encuentra el sonido de la parte
local sound = projectile:FindFirstChild("Impact")
-- Reproduce el sonido solo si no está reproduciendo
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Script - Play Button Click Usando Debounce

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

Efectos de recolección

Las experiencias a menudo incluyen recogidas de coleccionables en el mundo 3D, como kit médicos, paquetes de munición y más. Si diseña estas recogidas para permanecer en el mundo para que los jugadores agarren una y otra vez, debe agregarse un tiempo de "tiempo de reutilización" antes de que se actualice y reactive la recogida.

Al igual que detectar colisiones, puedes administrar el estado de rebote con un atributo de instancia, y visualizar el período de tiempo de reutilización cambiando el estado de la parte Class.BasePart.Transparency|Transparency .

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 a verdadero
humanoid.Health += 25 -- Aumentar la salud del jugador
part.Transparency = 0.75 -- Haga que la parte sea semitransparente para indicar el estado de enfriamiento
task.wait(COOLDOWN_TIME) -- Espere la duración de la cooldown
part.Transparency = 0 -- Restablecer la parte para ser completamente opaca
part:SetAttribute("CoolingDown", false) -- Restablecer atributo
end
end
end
part.Touched:Connect(healPlayer)