制御構造には、複数の条件を持たせることができます。キーワード else と elseif を使用することで、複数の条件下で何が起こるべきかを追加のシナリオとして作成できます。構文は次のようになります。
elseif と else の構文を示すif isGreen thenprint("進め")elseif isYellow thenprint("ゆっくり")elseif isPedestrians thenprint("待って")elseprint("停止")end
このプロジェクトでは、else と elseif を使用して、ランナーがフィニッシュタイムに応じて賞を受け取るパルクールコースをコーディングします。

複数の条件をコーディングする
このプロジェクトでは、各メダルに対してユニークな if 文を作成してプレイヤーに賞を授与することができますが、それには多くの時間がかかります。たとえば、以下の架空のコードを考えてみてください。
すべての if 文if finishTime < 5 then-- 金メダルを取得endif finishTime >= 5 and <= 10 then-- 銀メダルを取得endif finishTime > 10 and <= 15 then-- 銅メダルを取得end
これをより読みやすく効率的にコーディングする方法として、単一の if 文を使用し、キーワード elseif を使って前の条件が真でない場合にテストするための代替条件を提供します。
elseif と else を使用if finishTime < 5 then-- 金メダルを取得elseif finishTime >= 5 and <= 10 then-- 銀メダルを取得elseif finishTime > 10 and <= 15 then-- 銅メダルを取得end
if/then ステートメントが実行されると、最初に見つけた 最初の 真の条件のコードのみを実行します。
レースコースの設定
最初にコースのスタートポイントとフィニッシュラインを設定し、プレイヤーのタイミングを計測し、異なるメダルを授与するスクリプトを作成します。
FinishLine という名前のアンカー付きパーツを作成します。テストを早くするために、スタートとフィニッシュを近くに配置します。スクリプトが完成した後にフィニッシュラインを移動できます。

フィニッシュパーツ 
コース全体 FinishLine に RaceManager という名前のスクリプトを挿入します。次に、レースが開始されてから経過した秒数を保存するための変数を 1 つ、FinishLine を参照するための 2 番目の変数を追加します。
local finishLine = script.Parentlocal timePassed = 0finish() という名前の関数を作成します。
local timePassed = 0local finishLine = script.Parentlocal function finish()end自分で:
- プレイヤーが触れたときに finish() を実行する partTouched() という名前の関数をコーディングします。
- フィニッシュラインパーツを partTouched() に接続します。
- コードを以下の例と比較します。
local function finish()print("フィニッシュラインに触れました")endlocal function partTouched(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenfinish()endendfinishLine.Touched:Connect(partTouched)プレイテストを行い、フィニッシュラインに触れたときに finish() が呼び出されることを確認します。
finish() を繰り返し実行しないようにする
現在、プレイヤーがフィニッシュラインに触れるたびに、finish() がプレイヤーがその部分に触れている限り連続して呼び出されます。
ブール値を使用して、finish() が一度だけ呼び出されるようにします。このブール値は、真または偽を保存する変数です。
raceActive という名前の新しい変数を作成し、true に設定します。
local timePassed = 0local finishLine = script.Parentlocal raceActive = true-- プレイヤーがフィニッシュラインパーツに触れると実行されるlocal function finish()finish() を呼び出す前に raceActive が真であるかを確認するために、if 文に 2 番目の条件を追加します。
local function partTouched(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid and raceActive == true thenfinish()endendfinish() が再度呼び出されないように、raceActive を false に設定します。
local function finish()print("フィニッシュラインに触れました")raceActive = falseendエクスペリエンスをプレイテストして、テストプリントステートメントが 1 回だけ表示されることを確認します。
時間を記録する
if 文のように、while ループも条件を使用して実行すべきかどうかを判断できます。プレイヤーの時間を計測するために、raceActive ブール値が真のときだけ実行される while true do ループを使用してタイマーを作成します。
スクリプトの下部に、while raceActive == true do と入力します。 Enter を押して補完機能を使い、end を追加します。
finishLine.Touched:Connect(partTouched)while raceActive == true doendループ内で、プレイヤーの時間を記録するために、timePassed 変数に 1 を加算します。作業をテストするために print ステートメントを含めます。
finishLine.Touched:Connect(partTouched)while raceActive == true dotask.wait(1)timePassed += 1print(timePassed)endエクスペリエンスをプレイテストし、各秒が Output ウィンドウに表示されることを確認します。
プレイヤーにメダルを授与する
最後に、if 文を使用して複数の条件に基づいてプレイヤーに異なる賞メダルを授与します。if 文と 2 つの elseif 文を使用して、プレイヤーのフィニッシュタイムを確認し、正しいメダルを授与します。
各メダルを授与できることを確認するために、print ステートメントを使用します。
local function finish()raceActive = falseprint("あなたは " .. timePassed .. " 秒で完走しました")end金メダルを授与するには、timePassed を所定のフィニッシュタイムに比較する if 文をコーディングします。この例では、プレイヤーの時間が 10 秒以下であるかどうかを確認します。
local function finish()raceActive = falseprint("あなたは " .. timePassed .. " 秒で完走しました")if timePassed <= 10 thenprint("金メダルを獲得しました!")endendプレイテストを行い、金メダルが授与できることを確認します。
追加の条件を追加する
金メダルの条件をテストした後は、elseif キーワードを使用して他のメダルの条件をコーディングします。
銀メダルの場合は、elseif を使用して次の所定の時間範囲を指定します。この例では、範囲が 10 秒を超え、20 秒以下のときです。
local function finish()raceActive = falseprint("あなたは " .. timePassed .. " 秒で完走しました")if timePassed <= 10 thenprint("金メダルを獲得しました!")elseif timePassed > 10 and timePassed <= 20 thenprint("銀メダルを獲得しました!")endend銅メダルにも同じパターンを使用します。以下の例を使ってコードを確認してください。
local function finish()raceActive = falseprint("あなたは " .. timePassed .. " 秒で完走しました")if timePassed <= 10 thenprint("金メダルを獲得しました!")elseif timePassed > 10 and timePassed <= 20 thenprint("銀メダルを獲得しました!")elseif timePassed > 20 and timePassed <= 30 thenprint("銅メダルを獲得しました!")endend銀メダルと銅メダルを得るためにプレイテストを行います。
トラブルシューティングのヒント
銀メダルと銅メダルが表示されない場合は、以下のいずれかを試してください。
- 各 elseif の後にその条件の後に then を追加する必要があります。
- partTouched() の中で、if 文の 2 番目の条件が == を使用していることを確認してください。たとえば raceActive == true のように。
- 各 elseif がスコープ内にあることを確認してください。すべての elseif 条件は、if/then ステートメントの最初の行と最後の end の間にある必要があります。
else 条件を追加する
プレイヤーがどのメダルも獲得しなかった場合、再挑戦を促すべきです。この場合、すべての他の条件が真でない場合に実行される else ステートメントを使用して、メッセージを表示できます。
最後の elseif の下、end の上で新しい行を始めて else と入力します。Then を追加しないでください。else の下に print ステートメントを使用して、再挑戦を促します。
local function finish()raceActive = falseprint("あなたは " .. timePassed .. " 秒で完走しました")if timePassed <= 10 thenprint("金メダルを獲得しました!")elseif timePassed > 10 and timePassed <= 20 thenprint("銀メダルを獲得しました!")elseif timePassed > 20 and timePassed <= 30 thenprint("銅メダルを獲得しました!")elseprint("再挑戦してください!")endendelse メッセージが表示されることを確認するためにプレイテストを行います。
まとめ
制御構造には複数のシナリオを持たせることができます。if 文を使用して初期の文を設定し、必要に応じて elseif 条件を追加します。最後に、すべての条件が偽である場合に何が起こるべきかを示すために else を使用します。
最初からすべての条件がチェックされ、最初に見つけた真の条件だけがコードを実行します。他の条件はチェックされず、そのコードは実行されません。
プロジェクトを完成させた後、スクリプトを拡張して新しい要素を追加する方法はいくつかあります。
- プレイヤーがフィニッシュ後にスタートラインに触れることでレースをリピートできるようにコードを追加します。
- レース中に時間を表示する方法を設計します。時間を Surface GUI を使用してパーツ上に表示することができます。たとえば、時間制限付きブリッジを作成するチュートリアル のように。
完成したスクリプト
local timePassed = 0
local finishLine = script.Parent
-- レースが終了したときに finish() とタイマーが繰り返されないように
local raceActive = true
-- プレイヤーがフィニッシュラインに触れて賞を見せるときに実行される
local function finish()
raceActive = false
print("あなたは " .. timePassed .. " 秒で完走しました")
if timePassed <= 10 then
print("金メダルを獲得しました!")
elseif timePassed > 10 and timePassed <= 20 then
print("銀メダルを獲得しました!")
elseif timePassed > 20 and timePassed <= 30 then
print("銅メダルを獲得しました!")
else
print("再挑戦してください!")
end
end
-- レースがアクティブなときにプレイヤーがパーツに触れたかどうかをチェック
local function partTouched(otherPart)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid and raceActive == true then
finish()
end
end
finishLine.Touched:Connect(partTouched)
-- レースがアクティブな間、レースの時間を記録し続けます。スクリプトの最後に置く必要があります。
while raceActive == true do
task.wait(1)
timePassed += 1
print(timePassed)
end