デバウンスパターン は、機能が複数回実行されるのを防ぐコーディングテクニックです。次のスクリプトシナリオは、デバウンスパターンを最高の実践として示しています。
衝突を検出する
触れると 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 イベントが複数回、簡単な物理コリジョンに基づいて速速に発動することを示します。
最初の接連絡で過剰なダメージを避けるために、インスタンス属性 を通じてダメージのクールダウン期間を強制するデバウンスシステムを追加できます。
スクリプト - デバウンスを使用してプレイヤーにダメージを与える
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)
トリガーサウンド
デバウンスは、サウンドエフェクトを使用する場合、例えば 2つのパーツが衝突するとき ( Touched ) 、またはユーザーがオンスクリーンボタンとインタラクトしたとき ( <
サウンドオーバーラップを防止するには、IsPlaying オブジェクトの Sound プロパティを使用して、Class.Sound オブジェクトをデバウンスできます:
スクリプト - デバウンスを使用して当たり判定サウンドをプレイ
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)
スクリプト - デバウンスを使用したボタンのプレイ
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 を変更してクールダウン期間を視覚化できます。
スクリプト - ダウンバウンスを使用した健康ピックアップ
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)