ebounce 模式是一種編程技術,可以防止功能執行太多次或輸入啟動太多次。以下 scripting 示例為示例ebounce 作為最佳實踐。
偵測碰撞
如果您想要創建一個危險陷阱零件,當碰到時造成 10 傷害。初始實現可能使用基本 BasePart.Touched 連接和一個 damagePlayer 函數,像這樣:
腳本-傷害玩家
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 -- 降低玩家生命值
end
end
part.Touched:Connect(damagePlayer)
在第一次看起來合理的時候,測試會顯示 Touched 事件在快速成功中發生多次子集,基於微妙的物理碰撞。
為了避免在初始聯絡時造成過度傷害,您可以添加一個減速系統,它會對傷害通過 實例屬性 設定冷卻時間。
腳本 - 使用 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) -- 將屬性設為 true
humanoid.Health -= 10 -- 降低玩家生命值
task.wait(RESET_TIME) -- 等待重設時間
part:SetAttribute("Touched", false) -- 重設屬性
end
end
end
part.Touched:Connect(damagePlayer)
啟動聲音
Debounce 也有助於與音效工作,例如播放兩個零件碰撞時發出的聲音 (Class.BasePart.Touched|Touched) 或在 Class.GuiButton.Activated|Activated 事件上播放音效時 ( Class.Sound:Play()
為了防止聲音重複,您可以使用 IsPlaying 對象的 Sound 屬物件來吸收剩餘聲音:
腳本 - 使用 Debounce 播放碰撞聲音
local projectile = script.Parent
local function playSound()
-- 在零件上找到兒音
local sound = projectile:FindFirstChild("Impact")
-- 播放聲音,只要它尚未播放
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
指令碼 - 使用 Debounce 按一下播放按鈕
local button = script.Parent
local function onButtonActivated()
-- 在按鈕上尋找兒音
local sound = button:FindFirstChild("Click")
-- 播放聲音,只要它尚未播放
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)
撿起效果
體驗通常包含玩家可以在 3D 世界中收集的可選取起來,例如醫療包、彈藥包和更多。如果您設計這些起來以便玩家可以在世界上重複使用,需要在領取更新後才會重新啟用前,需要設置"冷卻"時間。
與 偵測碰撞 相似,您可以使用 實例屬性 來管理彈弓狀態,並且視覺化冷卻期,改變零件的 Class.BasePart.Transparency|Transparency 。
指令碼 - 使用 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) -- 將屬性設為 true
humanoid.Health += 25 -- 增加玩家生命值
part.Transparency = 0.75 -- 將零件半透明,以顯示冷卻狀態
task.wait(COOLDOWN_TIME) -- 等待冷卻時間
part.Transparency = 0 -- 將零件全部設置為半透明
part:SetAttribute("CoolingDown", false) -- 重設屬性
end
end
end
part.Touched:Connect(healPlayer)