控制結構可以有多個條件。關鍵字 else 和 elseif 可以為其他條件創建額外的場景。其語法如下:
顯示 elseif 和 else 的語法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 關鍵字以提供替代條件來檢測先前的條件是否不為真。
使用 elseif 和 elseif finishTime < 5 then-- 獲得金牌elseif finishTime >= 5 and <= 10 then-- 獲得銀牌elseif finishTime > 10 and <= 15 then-- 獲得銅牌end
當 if/then 語句運行時,將從上方開始,並僅運行找到的 第一個 真條件的代碼。
設定比賽賽道
首先放置課程的起點和終點,然後創建一個腳本來計時並為玩家授予不同的獎牌。
創建一個命名為 FinishLine 的固定部件。為了加快測試速度,把起點和終點放得很近。你可以在完成腳本後移動終點線。

終點部件 
整個賽道 在 FinishLine 中,插入一個名為 RaceManager 的腳本。然後,添加一個變數來存儲比賽開始以來經過的秒數,以及第二個變數來引用 FinishLine。
local finishLine = script.Parentlocal timePassed = 0創建一個名為 finish() 的函數。
local timePassed = 0local finishLine = script.Parentlocal function finish()end自行:
- 編寫一個名為 partTouched() 的函數,當玩家觸碰時運行 finish()。
- 將終點線部件連接到 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 語句中添加第二個條件,以檢查 raceActive 是否為真,然後再調用 finish()。
local function partTouched(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid and raceActive == true thenfinish()endend要防止 finish() 被再次調用,將 raceActive 設置為 false。
local function finish()print("觸碰了終點線")raceActive = falseend進行遊戲測試以檢查你的測試打印語句是否只顯示一次。
計時
像 if 語句一樣,while 循環也可以使用條件來檢查是否應運行。要計時玩家,使用 while true do 循環在 raceActive 布林值為真時運行。
在腳本的底部,鍵入 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 語句和兩個 elseif 語句來檢查玩家的完成時間並授予正確的獎牌。
為了確認每個獎牌可以頒發,使用打印語句。
local function finish()raceActive = falseprint("你完成了 " .. timePassed)end要授予金牌,編寫一個 if 語句,將 timePassed 與期望的完成時間進行比較。這個例子檢查玩家的時間是否小於或等於 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 語句的第二個條件使用 ==,如 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("再試一次!")endend進行遊戲測試以查看 else 消息。
總結
控制結構可以有多種情景。使用 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