多重起動の禁止(デバウンス)

もっけ
もっけ

例えば、プレイヤーがパーツに触れた時、複製したアイテムが何個も出てきたり、

ダメージを何度もくらってしまうことがあると思います。

これを防ぐ仕組みとして、デバウンスというものがあります。
今回は、デバウンスの仕組みについて説明します。

出来るようになること

  • 何回もスクリプトが連続して起動しないように出来る

デバウンスの仕組み

パーツに触った時、ダメージを与えるスクリプトを書きました。これを実行したら、どうなるでしょう。

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
もっけ
もっけ

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

スクリプトはプレイヤー全員に対して動くので、誰かがダメージをくらった際に、他のプレイヤーは、パーツのスクリプトがtask.wait()の待機時間中はダメージをくらわないよ。

コメント

タイトルとURLをコピーしました