制御構造は、複数の条件を持つことができます。キーワード else と elseif は、いくつかの条件の下で何が起こるべきかの追加シナリオを作成できます。構文は次のようになります。
if isGreen then
print("進め")
elseif isYellow then
print("減速")
elseif isPedestrians then
print("待て")
else
print("停止")
endこのプロジェクトでは、else と elseif を使用して、ランナーが完走時間に応じて賞を受け取るパルクールコースをコーディングします。

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

フィニッシュパート 
全コース FinishLineにRaceManagerという名前のスクリプトを挿入します。次に、レースが開始されてから経過した秒数を格納するための変数と、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()if文に2番目の条件を追加して、finish() を呼び出す前に raceActive が真であるかどうかを確認します。
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ゲームをプレイテストして、テストの印刷文が一度だけ表示されることを確認します。
時間を追跡する
if文のように、whileループも条件を使用して実行するかどうかを確認できます。プレイヤーのタイミングを計るために、raceActive ブール値が真であるときだけ実行されるwhile true doループを使用してタイマーを作成します。
スクリプトの最後に while raceActive == true do と入力します。Enterを押して自動補完し、end を追加します。
finishLine.Touched:Connect(partTouched)while raceActive == true doendプレイヤーの時間を計るために、ループ内で timePassed 変数に1を加えます。作業をテストするために印刷文を含めます。
finishLine.Touched:Connect(partTouched)while raceActive == true dotask.wait(1)timePassed += 1print(timePassed)endゲームをプレイテストして、各秒が出力ウィンドウに表示されることを確認します。
プレイヤーにメダルを授与する
最後に、if文を使用して複数の条件に基づいてプレイヤーに異なる賞メダルを授与します。if文と2つのelseif文を使用して、プレイヤーの完走時間を確認し、正しいメダルを授与します。
各メダルが授与できることを確認するために、印刷文を使用します。
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の下に、再挑戦を促す印刷文を使用します。
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 を使用します。
最初からすべての条件がチェックされ、最初の真の条件のみがコードを実行します。残りの条件はチェックされず、そのコードも実行されません。
プロジェクトを完成させた後、スクリプトを拡張して新しい要素を追加する方法はいくつかあります。
- プレイヤーが完走後にスタートラインに触れることでレースを繰り返すことができるようにコードを追加します。
- レース中に時間を表示する方法を設計します。サーフェス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