Pattern di Debounce

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

Un pattern debounce è una tecnica di codifica che impedisce a una funzione di essere eseguita troppi volte o un input di essere attivato più volte. I seguenti scripting script mostrano debounce come migliore pratica.

Rilevare le collisioni

Supponi di voler creare una parte di trappola pericolosa che infligge 10 danni quando toccata. Un'implementazione iniziale potrebbe utilizzare una connessione di base BasePart.Touched e una funzione damagePlayer come questa:

Script - Danni al giocatore

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 -- Riduci la salute del giocatore
end
end
part.Touched:Connect(damagePlayer)

Mentre è logico alla prima vista, i test mostreranno che l'evento Touched attiva più volte in rapida successione in base a collisioni fisiche sottili.

Per evitare di causare danni eccessivi inizialmente, puoi aggiungere un sistema di rimbalzo che impone un periodo di cooldown per i danni attraverso un attributo dell'istanza .

Script - Danni il giocatore 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) -- Imposta l'attributo a vero
humanoid.Health -= 10 -- Riduci la salute del giocatore
task.wait(RESET_TIME) -- Attendere la durata di ripristino
part:SetAttribute("Touched", false) -- Ripristina l'attributo
end
end
end
part.Touched:Connect(damagePlayer)

Suoni di allenamento

Il debounce è anche utile quando si lavora con effetti sonori, come riprodere un suono quando due parti collidono ( Touched ) o riprodere un suono sull'evento Activated quando un utente interagisce con un pulsante sullo schermo. In

Per prevenire l'ovrapposizione sonora, puoi debounce usando la proprietà IsPlaying dell'oggetto Sound :

Script - Riproduci il suono di collisione usando Debounce

local projectile = script.Parent
local function playSound()
-- Trova il suono figlio sulla parte
local sound = projectile:FindFirstChild("Impact")
-- Riproduci il suono solo se non sta già giocando
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Script - Clicca il pulsante Play utilizzando Debounce

local button = script.Parent
local function onButtonActivated()
-- Trova il suono figlio sul pulsante
local sound = button:FindFirstChild("Click")
-- Riproduci il suono solo se non sta già giocando
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)

Effetti di raccolta

Le esperienze spesso includono pickup collezionabili nel mondo 3D come kit medici, pacchetti di munizioni e altro ancora. Se progetti questi pickup per rimanere nel mondo per i giocatori che possono essere catturati ancora e ancora, dovrebbe essere aggiunto un tempo di "cooldown" prima che il pickup si aggiorni e si riattivi.

Simile allo individuazione delle collisioni, puoi gestire lo stato di rimbalzo con un attributo istanza e visualizzare il periodo di cooldown modificando la parte's Transparency .

Script - Raccolta della salute utilizzando 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) -- Imposta l'attributo a vero
humanoid.Health += 25 -- Aumenta la salute del giocatore
part.Transparency = 0.75 -- Rende la parte semi-trasparente per indicare lo stato di cooldown
task.wait(COOLDOWN_TIME) -- Attendere la durata del cooldown
part.Transparency = 0 -- Ripristina la parte per renderla completamente opaca
part:SetAttribute("CoolingDown", false) -- Ripristina l'attributo
end
end
end
part.Touched:Connect(healPlayer)