Motifs de débounce

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.

Un débounce motif est une technique de codage qui empêche une fonction d'exécuter trop de fois ou une entrée de se déclencher plusieurs fois. Les scripts suivants ont des exemples de scriptes de meilleures pratiques.

Détection des collisions

Supposez 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 peut utiliser une connexion de base BasePart.Touched et une fonction de damagePlayer comme ceci :

Script - Endommager le 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, le test montrera que l'événement Touched déclenche plusieurs fois rapidement en succession basée sur des collisions physiques subtiles.

Pour éviter de causer des dommages excessifs lors du contacterinitial, vous pouvez ajouter un système de débounce qui impose une période de repos sur les dommages via un attribut d'instance.

Script - Endommager le 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) -- Réinitialiser l'attribut
end
end
end
part.Touched:Connect(damagePlayer)

Activer les sons

Le rebond est également utile lorsque vous travaillez avec des effets sonores, tels que le jouer d'un son lorsque deux parties collident ( Touched ) ou le jouer d'un son sur l'événement Activated lorsqu'un utilisateur interagit

Pour éviter les chevauchements sonores, 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 pièce
local sound = projectile:FindFirstChild("Impact")
-- Jouez le son seulement si il ne joue pas déjà
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Script - Cliquez sur le bouton Jouer en utilisant Debounce

local button = script.Parent
local function onButtonActivated()
-- Trouver le son enfant sur le bouton
local sound = button:FindFirstChild("Click")
-- Jouez le son seulement si il ne joue pas déjà
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)

Effets de ramassage

Les expériences incluent souvent des pickups collectibles dans le monde 3D tels que des kits de soins, des packs de munitions et plus encore. Si vous concevez ces pickups pour rester dans le monde pour que les joueurs puissent les attraper à nouveau et à nouveau, un "cooldown" temps doit être ajouté avant que la prise se rafraîchisse et se réactive.

Semblable à détection des collisions, vous pouvez gérer l'état de débounce avec un Transparency, et visualiser la période de recharge en modifiant la 1> Class.BasePart.Transparency|Transparency « .

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é des joueurs
part.Transparency = 0.75 -- Faites partiellement transparent pour indiquer l'état de recharge
task.wait(COOLDOWN_TIME) -- Attendez la durée de recharge
part.Transparency = 0 -- Réinitialisez la partie pour qu'elle soit complètement opaque
part:SetAttribute("CoolingDown", false) -- Réinitialiser l'attribut
end
end
end
part.Touched:Connect(healPlayer)