Un modèle débounce est une technique de codage qui empêche une fonction de s'exécuter trop de fois ou un entrée de déclencher plusieurs fois.Les scénarios de script suivants illustrent le débounce en tant que meilleure pratique.
Détecter les collisions
Supposons que vous voulez créer une partie de piège dangereuse qui inflige 10 dégâts lorsqu'elle est touchée.Une implémentation initiale pourrait utiliser une connexion de base BasePart.Touched et une fonction damagePlayer comme celle-ci :
Script - Dégâts du joueur
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 -- Réduire la santé du joueur
end
end
part.Touched:Connect(damagePlayer)
Bien que logique à première vue, les tests montreront que l'événement Touched se déclenche plusieurs fois en succession rapide en fonction de collisions physiques subtiles.

Pour éviter de causer des dommages excessifs lors du premier contacter, vous pouvez ajouter un système de décalage qui impose une période de récupération sur les dommages via un attribut d'instance .
Script - Dégâts du joueur en utilisant 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) -- Définir l'attribut à vrai
humanoid.Health -= 10 -- Réduire la santé du joueur
task.wait(RESET_TIME) -- Attendez la durée de réinitialisation
part:SetAttribute("Touched", false) -- Attribut de réinitialisation
end
end
end
part.Touched:Connect(damagePlayer)
Activer les sons
Debounce est également utile lors du travail avec des effets sonores, tels que la lecture d'un son lorsque deux parties se heurtent ( Touched ), ou la lecture d'un son lors de l'événement Activated lorsqu'un utilisateur interagit avec un bouton sur l'écran.Dans les deux cas, l'appel de Sound:Play() lance la lecture depuis le début de sa piste et — sans système de débounce — le son peut jouer plusieurs fois en succession rapide.
Pour empêcher la superposition du son, vous pouvez débouncer en utilisant la propriété IsPlaying de l'objet Sound:
Script - Jouer le son de collision en utilisant Debounce
local projectile = script.Parent
local function playSound()
-- Trouver le son enfant sur la partie
local sound = projectile:FindFirstChild("Impact")
-- Jouez le son seulement si ce n'est pas déjà le cas
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Script - Bouton de lecture cliqué en utilisant le décalage
local button = script.Parent
local function onButtonActivated()
-- Trouver le son enfant sur le bouton
local sound = button:FindFirstChild("Click")
-- Jouez le son seulement si ce n'est pas déjà le cas
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)
Effets de récupération
Les expériences incluent souvent des récupérations de collection dans le monde 3D telles que des kits médicaux, des packs de munitions et plus encore.Si vous concevez ces prises pour rester dans le monde pour que les joueurs les prennent encore et encore, un temps de « récupération » devrait être ajouté avant que la prise se rafraîchisse et se réactive.
Semblable à détecter les collisions , vous pouvez gérer l'état de décalage avec un attribut d'instance et visualiser la période de récupération en modifiant la partie .
Script - Récupération de la santé en utilisant 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) -- Définir l'attribut à vrai
humanoid.Health += 25 -- Augmenter la santé du joueur
part.Transparency = 0.75 -- Rendre la partie semi-transparente pour indiquer l'état de récupération
task.wait(COOLDOWN_TIME) -- Attendez la durée de récupération
part.Transparency = 0 -- Réinitialiser la partie pour qu'elle soit entièrement opaque
part:SetAttribute("CoolingDown", false) -- Attribut de réinitialisation
end
end
end
part.Touched:Connect(healPlayer)