
もっけ
例えば、プレイヤーがパーツに触れた時、複製したアイテムが何個も出てきたり、
ダメージを何度もくらってしまうことがあると思います。
これを防ぐ仕組みとして、デバウンスというものがあります。
今回は、デバウンスの仕組みについて説明します。
出来るようになること
- 何回もスクリプトが連続して起動しないように出来る
デバウンスの仕組み
パーツに触った時、ダメージを与えるスクリプトを書きました。これを実行したら、どうなるでしょう。
local part = script.Parent
local function damage(hit)
local humanoid = hit.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
print("part name is ", hit.Parent)
humanoid.Health = humanoid.Health - 10 -- ダメージを10与える
end
end
part.Touched:Connect(damage)
パーツにちょっと触れただけなのに、何回もダメージをくらってることがprintで出したログからわかります。
23:18:38.585 part name is RightFoot - サーバー - Script:6
23:18:38.586 part name is LeftUpperLeg - サーバー - Script:6
23:18:38.712 part name is LeftLowerLeg - サーバー - Script:6
23:18:38.834 part name is LeftFoot - サーバー - Script:6
23:18:38.994 part name is RightFoot - サーバー - Script:6
23:18:41.202 part name is LeftFoot - サーバー - Script:6




もっけ
右足、左足・・・いろんなパーツでダメージをくらってますね💧
そこで、先程のコードにデバウンスを入れてみましょう!
local part = script.Parent
local function damage(hit)
local humanoid = hit.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
if not part:GetAttribute("Touched") then -- Touched属性が無効だったら
part:SetAttribute("Touched", true) -- パーツにTouched属性を追加して、有効(true)にする
print("part name is ", hit.Parent)
humanoid.Health = humanoid.Health - 10 -- ダメージを10与える
task.wait(1) -- 1秒間待つ
part:SetAttribute("Touched", false) -- パーツにTouched属性を追加して、無効(false)にする
end
end
end
part.Touched:Connect(damage)
すると、どうでしょう!ログを見て分かる通り、ダメージをくらうまでに1秒間の空きがあります。
23:33:28.868 part name is LeftFoot - サーバー - Script:8
23:33:29.918 part name is RightLowerLeg - サーバー - Script:8




もっけ
連続で処理されることを防ぐためには、デバウンスを使おう!



コメント