Um padrão de desaceleração é uma técnica de codificação que impede que uma função seja executada muitas vezes ou que uma entrada seja acionada muitas vezes.Os seguintes cenários de script ilustram o debounce como uma melhor prática.
Detectar colisões
Suponha que você queira criar uma parte de armadilha perigosa que inflige 10 de dano quando tocada.Uma implementação inicial pode usar uma conexão básica BasePart.Touched e uma função damagePlayer como esta:
Script - Danificar Jogador
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 -- Reduzir a saúde do jogador
end
end
part.Touched:Connect(damagePlayer)
Embora lógico à primeira vista, os testes mostrarão que o evento Touched atira várias vezes em rápida sucessão com base em colisões físicas sutis.

Para evitar causar dano excessivo no contatarinicial, você pode adicionar um sistema de debounce que impõe um período de espera no dano através de um atributo de instância .
Script - Danificar jogador 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) -- Defina o atributo para verdadeiro
humanoid.Health -= 10 -- Reduzir a saúde do jogador
task.wait(RESET_TIME) -- Espere pela duração de redefinição
part:SetAttribute("Touched", false) -- Atributo de redefinição
end
end
end
part.Touched:Connect(damagePlayer)
Ativar sons
O Debounce também é útil ao trabalhar com efeitos sonoros, como tocar um som quando duas partes colidirem ( Touched ), ou tocar um som no evento Activated quando um usuário interage com um botão na tela.Em ambos os casos, chamar Sound:Play() inicia a reprodução desde o início de sua faixa e - sem um sistema de debounce - o som pode tocar várias vezes em rápida sucessão.
Para evitar sobreposição de som, você pode desacelerar usando a propriedade IsPlaying do ObjetoSound:
Script - Reproduza o som de colisão usando Debounce
local projectile = script.Parent
local function playSound()
-- Encontre o som da criança na parte
local sound = projectile:FindFirstChild("Impact")
-- Reproduza o som somente se ele ainda não estiver tocando
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Script - Clique no botão de reprodução usando Debounce
local button = script.Parent
local function onButtonActivated()
-- Encontre o som da criança no botão
local sound = button:FindFirstChild("Click")
-- Reproduza o som somente se ele ainda não estiver tocando
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)
Efeitos de coleta
Experiências muitas vezes incluem coleções de colecionáveis no mundo 3D, como kits médicos, pacotes de munição e muito mais.Se você projetar essas coletas para permanecer no mundo para que os jogadores as peguem uma e outra vez, deve ser adicionado um tempo de "resfriamento" antes que as coletas sejam atualizadas e reativadas.
Semelhante ao detectar colisões , você pode gerenciar o estado de debounce com um atributo de instância e visualizar o período de espera alterando a parte .
Script - Coleta de Saúde 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) -- Defina o atributo para verdadeiro
humanoid.Health += 25 -- Aumentar a saúde do jogador
part.Transparency = 0.75 -- Faça a parte semi-transparente para indicar o estado de espera
task.wait(COOLDOWN_TIME) -- Espere pela duração de espera
part.Transparency = 0 -- Redefinir parte para ficar totalmente opaca
part:SetAttribute("CoolingDown", false) -- Atributo de redefinição
end
end
end
part.Touched:Connect(healPlayer)