Touchedが何回も反応してしまう

入門トラブル更新日:2026年11月13日Luauの型チェック済み

ひとことで言うと

ふれたときの処理が、一度に何回も動いてしまう問題の直し方(デバウンス)です。

この記事で使うAPI

BasePart

原因

キャラクターは、頭・胴体・手足など、たくさんのパーツでできています。それぞれがふれるたびにTouchedが起きるので、一度ふれただけで何回も反応します。

直し方:デバウンス

「処理中かどうか」を変数で覚えておき、処理中なら何もしないようにします。この考え方をデバウンスといいます。

(Script/置く場所:パーツの中)

local part = script.Parent :: BasePart
local debounce = false

part.Touched:Connect(function(hit)
	if debounce then
		return
	end
	local character = hit.Parent
	if not character or not character:FindFirstChildWhichIsA("Humanoid") then
		return
	end
	debounce = true
	task.wait(0.5)
	part.Transparency = 1
	part.CanCollide = false
	task.wait(3)
	part.Transparency = 0
	part.CanCollide = true
	debounce = false
end)

プレイヤーごとに1回にしたいとき

テーブルに、もう反応したプレイヤーを記録します。

local touched = {}
local part = script.Parent

part.Touched:Connect(function(hit)
	local player = game:GetService("Players"):GetPlayerFromCharacter(hit.Parent)
	if player and not touched[player] then
		touched[player] = true
		print(player.Name .. "がふれました")
	end
end)
執筆・動作確認:鈴木孝昌官公庁のWeb・システム開発を担当する現役プロジェクトマネージャー。沖縄マイクラ部 クロスウェーブで、ロブロックス(Roblox)・マインクラフト(マイクラ)・Scratchなどのプログラミングを指導。マイクラカップ沖縄代表チームを指導(第6回・第7回、第7回TBS賞)。
沖縄マイクラ部で、子どもたちにロブロックス(Roblox)やマインクラフト(マイクラ)のプログラミングを教えています。プロフィールと編集方針
Instagramで教室の様子を見る
noteで記事を読む