ゴールライン
CoddyのLuaジャーニー「Robloxゲームのスクリプティング」セクションの一部。レッスン 23/24。
ゴールラインは勝利を記録し、勝者をスタート地点に戻します。player:LoadCharacterAsync()を使うと、リスポーンタイマーを待たずに、プレイヤーのスポーン地点に新しいキャラクターを出現させます。
少し時間がかかります。新しいキャラクターが現れるまでの間、ゴールは古いキャラクターのほかの身体パーツに対してもTouchedを発火し続け、そのたびに勝利が記録されてしまいます。これを防ぐのがデバウンスです。また、ゴールにはプレイヤーごとに1つ必要なので、2人のプレイヤーが同時にゴールした場合は、両方の勝利が記録されます。プレイヤーをキーとして、テーブルに状態を保存します:
local busy = {}
if not busy[player] then
busy[player] = true
-- 勝利をカウントし、プレイヤーを元の場所に戻す
task.wait(1)
busy[player] = nil
endbusy[player]は、そのプレイヤーに対応するテーブルの項目を読み取ったり設定したりします。項目がない場合はnilになります。busy[player] = nilとすると項目が削除されるため、次にゴールを通過したときには、再び勝利が記録されます。
チャレンジ
中級金色のパッドがゴールで、このスクリプトはその中にあります。すべてのプレイヤーにはすでにleaderstatsがあり、Winsは0に設定されています。また、プレイヤーごとのデバウンスも設定済みです。
- プレイヤーの
Winsに1を加えます。 player:LoadCharacterAsync()でプレイヤーをスタート地点に戻します。- その後、デバウンスを解除して、次の走行がカウントされるようにします。
Playを押して、ゴールまで2回走り、その後Checkを押してください。
自分で試してみよう
local Players = game:GetService("Players")
local finish = script.Parent
local busy = {}
finish.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
if player and not busy[player] then
busy[player] = true
-- 1. プレイヤーのWinsに1を加える
-- 2. プレイヤーをスタート地点に戻す
-- 3. 1秒後、プレイヤーが再び勝てるようにする
end
end)
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Robloxゲームのスクリプティングのすべてのレッスン
自分で練習してみよう: Luaオンラインコンパイラ