Menu
CoddyTech

コイン集め

CoddyのLuaジャーニー「Robloxゲームのスクリプティング」セクションの一部。レッスン 15/24。

宝物パッドはコインを設定して100にしました。コインは加算を1行うはずですが、そこで新たな問題が発生します。

Touchedは、触れたすべての身体パーツに対して発火するため、コインに一歩踏み込むだけで何度も発火することがあります。そのたびに1ポイントを加算すると、1枚のコインで複数のポイントが得られてしまいます。

解決策はデバウンスです。「これはすでに起きた」と記憶する変数を使い、コードが繰り返しを無視するようにします。

local used = false
button.Touched:Connect(function(hit)
	if not used then
		used = true
		print("Pressed!")
	end
end)

usedがfalseの間、not usedはtrueなので、最初の接触だけがif not usedを通過します。a and bは両方がtrueのときだけtrueになります。つまり、if player and not used thenには、プレイヤーがいて、コインが未使用であることが必要です。

後でもう一度発生させるには、待機してからリセットします。task.wait(3)の後にused = falseを実行します。待機するのはこの関数だけなので、ほかの接触イベントは引き続き発生し、usedがtrueの間は無視されます。

value += 1はvalue = value + 1の短縮形です。また、CanTouch = falseにすると、再びtrueに設定するまで、パーツはTouchedを発火しなくなります。

challenge icon

チャレンジ

中級

leaderstatsとTouched接続の準備はできていますが、Playを押してコインを通り抜けると、Coinsが1より大きく増えます。

これを修正して、コインを完成させましょう。

  1. 各コインを拾うと、ちょうど1 Coinが加算されます(コインごとのデバウンス)。
  2. 拾われたコインは非表示になります。Transparency 1、CanTouch false。
  3. 3秒後に再び表示され(Transparency 0、CanTouch true)、もう一度拾えるようになります。

自分で試してみよう

local Players = game:GetService("Players")
local coins = workspace.Coins

Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local coinsValue = Instance.new("IntValue")
	coinsValue.Name = "Coins"
	coinsValue.Value = 0
	coinsValue.Parent = leaderstats
end)

for _, coin in coins:GetChildren() do
	coin.Touched:Connect(function(hit)
		local player = Players:GetPlayerFromCharacter(hit.Parent)
		if player then
			player.leaderstats.Coins.Value += 1
		end
	end)
end
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Robloxゲームのスクリプティングのすべてのレッスン

自分で練習してみよう: Luaオンラインコンパイラ