コントロール構造は複数の状態を持つことができます。キーワード else および elseif は、複数の状態の下で発生する可能性のある追加のシナリオを作成できます。構文は次のように見えます:
他と違うシリアルを示します
if isGreen thenprint("Go")elseif isYellow thenprint("Slow")elseif isPedestrians thenprint("Wait")elseprint("stop")end
このプロジェクトでは、else とelseif は、ランナーがфиニッシュ時間に応じて報酬を受け取るパルクールコースをコード化するために使用されます。
複数のコンディションをコード化する
このプロジェクトの場合、プレイヤーに授与するメダルごとにユニークな if 文を作成できますが、これは時間がかかります。たとえば、以下の想像コードを取りましょう。
すべての if 文
if finishTime < 5 then-- ゴールドメダルを獲得endif finishTime >= 5 and <= 10 then-- 銀のメダルを獲得endif finishTime > 10 and <= 15 then-- ブロンズメダルを獲得end
これをコードするためのもっと読みやすく効率的な方法は、単一 if 文を使用し、キーワード elseif を使用して、以前の条件が真実でない場合に代替の条件を提供することです。
else と else を使用
if finishTime < 5 then-- ゴールドメダルを獲得elseif finishTime >= 5 and <= 10 then-- 銀のメダルを獲得elseif finishTime > 10 and <= 15 then-- ブロンズメダルを獲得end
式 if/then が実行されると、上部で実行し、 最初 、それが見つかるコンディションのコードのみを実行します。
レースコースのセットアップ
コースの開始場所と終了場所を配置し、スクリプトを作成してプレイヤーに時間を設定し、さまざまなメダルを授与します。
FinishLine という名前の錨付きパーツを作成します。テストをより速くするために、開始と終了を近づけて配置してください。スクリプトを終了後にフィニッシュラインを移動できます。
終了ラインに、RaceManager という名前のスクリプトを挿入します。次に、終了ラインからレースが始まってから何秒経ったかを保存する変数を 1つ追加し、終了ラインにリファレンスする変数を 1つ追加します。
local finishLine = script.Parentlocal timePassed = 0関数を作成して finish() という名前です。
local timePassed = 0local finishLine = script.Parentlocal function finish()end独自所有:
- プレイヤーが触れると finish() を実行するコードを partTouched() という名前で実行します。
- フィニッシュラインパーツを partTouched() に接続します。
- コードを以下の例に比較してください。
local function finish()print("touched the finish line")endlocal function partTouched(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenfinish()endendfinishLine.Touched:Connect(partTouched)プレイテストして、finish() がタッチしたフィニッシュラインを呼び出されるかどうかをチェックします。
終了を繰り返すことから守る
現在、プレイヤーがフィニッシュラインに触れるたびに、 finish() はプレイヤーがパーツに触れるまで連続して呼び出されます。
Boolean 、 変数 、 True または False を保存する変数を使用して、終了() を 1 回だけ呼び出すようにします。
新しい変数を作成し、raceActive と名前付け、true に設定します。
local timePassed = 0local finishLine = script.Parentlocal raceActive = true-- プレイヤーがフィニッシュラインの部分に触れるときに実行されますlocal function finish()if 文にコンディションを追加して、レースアクティブが true であるかどうかをチェックします。
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("touched the finish line")raceActive = falseendプレイテストして、あなたのゲームがテストプリントステートメントを 1 回だけ見ることを確認します。
時間の経過を追跡する
if 文のように、 while ループは、条件を使用して実行するかどうかを確認することもできます。プレイヤーに時間を設定するには、raceActive ボクスが true であるときのみ実行するように、タイマーを作成します。
スクリプトの下部に、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 文と two 以下の文を使用して、プレイヤーの終了時間をチェックし、正しいメダルを授与します。
各メダルが授与されることを確認するには、印刷ステートメントを使用してください。
local function finish()raceActive = falseprint("You finished in " .. timePassed)end金メダルを授与するには、timePassed と希望の終了時間を比較する if ステートメントをコードします。この例では、プレイヤーの時間が 10 秒未満であるかどうかをチェックします。
local function finish()raceActive = falseprint("You finished in " .. timePassed)if timePassed <= 10 thenprint("You get a gold medal!")endendプレイテストを実行し、金メダルを授与できるかどうかを確認します。
追加のコンディションを追加する
さあ、金メダルのためにテストしたので、elseif キーワードを使用して他のメダルのコード条件をテストしています。
シルバーメダルの場合、elseif を使用し、次の必要な時間範囲を設定します。この例では、範囲は 10秒以上ですが、20秒以下です。
local function finish()raceActive = falseprint("You finished in " .. timePassed)if timePassed <= 10 thenprint("You get a gold medal!")elseif timePassed > 10 and timePassed <= 20 thenprint("You get a silver medal!")endendブロンズメダルのための同じパターンを使用します。以下の例と共にコードをチェックしてください。
local function finish()raceActive = falseprint("You finished in " .. timePassed)if timePassed <= 10 thenprint("You get a gold medal!")elseif timePassed > 10 and timePassed <= 20 thenprint("You get a silver medal!")elseif timePassed > 20 and timePassed <= 30 thenprint("You get a bronze medal!")endend銀とブロンズのメダルのためのプレイテスト。
トラブルシューティングのヒント
銀やブロンズのメタルが見えない場合は、以下の 1つを試してください。
- それぞれ elseif の後に、そのコンディションの後に使用する必要があります。
- In partTouched() で、if 文の 2つ目の条件が == を使用していることを確認してください。In raceActive == true で。
- 各 elseif がスコープ内にあるかどうかをチェックします。各 elseif コンディションは if/then 文の最初の行と最後の end の間にある必要があります。
Else コンディションを追加する
プレイヤーがメダルを獲得しなかった場合は、再び試すようにすすめる必要があります。この場合、else ステートメントを使用して、no other 条件が真実でない場合に実行されると、メッセージを表示することができます。
最後の elseif 以下にあり、上の end 以上にあり、新しい行を開始し、else を入力します。1> を追加してはなりません。以下の他の、プリントステートメントを使用してプロンプトします。
local function finish()raceActive = falseprint("You finished in " .. timePassed)if timePassed <= 10 thenprint("You get a gold medal!")elseif timePassed > 10 and timePassed <= 20 thenprint("You get a silver medal!")elseif timePassed > 20 and timePassed <= 30 thenprint("You get a bronze medal!")elseprint("Try again!")endend
2. 他のメッセージを確認するためにプレイテストをプレイ。
概要
コントロール構造は、1つのスキナリオをもっと持つことができます。使用する if 文を使用して、最初のステートメントをチェックし、その後、必要に応じて多くの elseif コンディションを追加します。最後に、else を使用して、すべての与えられたコンディションが偽である場合を含め、何が起こるべきかをステートします。
上部から開始し、すべての条件がチェックされます。最初の真の条件のみがコードを実行します。残りの条件はチェックされず、コードも実行されません。
プロジェクトを完了した後、スクリプトを拡張して、追加のいくつかの方法で新しい要素を追加できます。
- プレイヤーが終了したときにスタートラインをタッチして、レースを繰り返すコードを追加します。
- レース中に時間を表示する方法を設計します。あなたは Surface GUI を使用してパーツ上の時間を表示するか、クリエート時の橋のチュートリアル で時間を表示することができます。
Completed script
local timePassed = 0
local finishLine = script.Parent
-- レースが終了したときに、終了()とタイマーを繰り返すのを防ぐために使用されます
local raceActive = true
-- プレイヤーがフィニッシュラインに到達したときに実行され、報酬を表示します
local function finish()
raceActive = false
print("You finished in " .. timePassed)
if timePassed <= 10 then
print("You get a gold medal!")
elseif timePassed > 10 and timePassed <= 20 then
print("You get a silver medal!")
elseif timePassed > 20 and timePassed <= 30 then
print("You get a bronze medal!")
else
print("Try again!")
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