Struktury kontrolne mogą mieć więcej niż jeden warunek. Słowa kluczowe else i elseif mogą tworzyć dodatkowe scenariusze dla tego, co powinno się wydarzyć w różnych warunkach. Składnia wygląda następująco:
if isGreen then
print("Idź")
elseif isYellow then
print("Zwolnij")
elseif isPedestrians then
print("Czekaj")
else
print("stop")
endW tym projekcie else i elseif są używane do kodowania trasy parkour, gdzie biegacze otrzymują nagrody w zależności od czasu ukończenia.

Kodowanie wielu warunków
W tym projekcie możesz napisać unikalne instrukcje if dla każdej medalu, aby nagrodzić graczy, ale zajmuje to dużo czasu. Weź na przykład poniższy wyimaginowany kod.
if finishTime < 5 then
-- Otrzymaj złoty medal
end
if finishTime >= 5 and <= 10 then
-- Otrzymaj srebrny medal
end
if finishTime > 10 and <= 15 then
-- Otrzymaj brązowy medal
endBardziej czytelny i efektywny sposób kodowania tego to użycie jednej instrukcji if i użycie słowa kluczowego elseif, aby dostarczyć alternatywne warunki do przetestowania, jeśli poprzednie warunki nie są prawdziwe.
if finishTime < 5 then
-- Otrzymaj złoty medal
elseif finishTime >= 5 and <= 10 then
-- Otrzymaj srebrny medal
elseif finishTime > 10 and <= 15 then
-- Otrzymaj brązowy medal
endGdy instrukcja if/then jest uruchamiana, zaczyna od góry i uruchamia kod tylko dla pierwszego prawdziwego warunku, który znajdzie.
Ustawienie trasy wyścigu
Zacznij od umieszczenia punktu startowego trasy i linii mety, a następnie stwórz skrypt, aby zmierzyć czas gracza i przyznać różne medale.
Utwórz unieruchomioną część o nazwie FinishLine. Aby przyspieszyć testowanie, umieść start i koniec blisko siebie. Możesz przesunąć linię mety po zakończeniu skryptu.

Część mety 
Cała trasa W FinishLine wstaw skrypt o nazwie RaceManager. Następnie dodaj jedną zmienną do przechowywania, ile sekund minęło od rozpoczęcia wyścigu, oraz drugą zmienną do odniesienia do FinishLine.
local finishLine = script.Parentlocal timePassed = 0Utwórz funkcję o nazwie finish().
local timePassed = 0local finishLine = script.Parentlocal function finish()endSamodzielnie:
- Zakoduj funkcję o nazwie partTouched(), która uruchamia finish(), gdy gracz ją dotknie.
- Połącz część linii mety z partTouched().
- Porównaj swój kod z poniższym przykładem.
local function finish()print("dotknięto linii mety")endlocal function partTouched(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenfinish()endendfinishLine.Touched:Connect(partTouched)Przetestuj grę i sprawdź, czy finish() jest wywoływane, gdy dotkniesz linii mety.
Zapobiegaj powtarzaniu finish()
W tej chwili, gdy gracz dotknie linii mety, finish() jest ciągle wywoływane, dopóki gracz dotyka części.
Użyj zmiennej logicznej, zmiennej, która przechowuje wartość prawda lub fałsz, aby upewnić się, że finish() jest wywoływane tylko raz.
Utwórz nową zmienną o nazwie raceActive i ustaw ją na true.
local timePassed = 0local finishLine = script.Parentlocal raceActive = true-- Uruchamia się, gdy gracz dotyka części linii metylocal function finish()Dodaj drugi warunek do instrukcji if, aby sprawdzić, czy raceActive jest prawdziwe przed wywołaniem finish().
local function partTouched(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid and raceActive == true thenfinish()endendAby zatrzymać ponowne wywoływanie finish(), ustaw raceActive na false.
local function finish()print("dotknięto linii mety")raceActive = falseendPrzetestuj swoją grę, aby sprawdzić, czy widzisz swoje testowe polecenie wydruku tylko raz.
Śledzenie czasu
Podobnie jak instrukcja if, pętla while może również używać warunku, aby sprawdzić, czy powinna działać. Aby zmierzyć czas gracza, utwórz timer za pomocą pętli while true do, która działa tylko wtedy, gdy zmienna logiczna raceActive jest prawdziwa.
Na końcu skryptu wpisz while raceActive == true do. Naciśnij Enter, aby automatycznie dodać end.
finishLine.Touched:Connect(partTouched)while raceActive == true doendAby zmierzyć czas graczy, w pętli dodaj 1 do zmiennej timePassed co sekundę. Dodaj polecenie wydruku, aby przetestować swoją pracę.
finishLine.Touched:Connect(partTouched)while raceActive == true dotask.wait(1)timePassed += 1print(timePassed)endPrzetestuj grę i sprawdź, czy widzisz każdą sekundę wyświetlaną w oknie Output.
Przyznawanie medali graczom
Aby zakończyć, użyj instrukcji if z wieloma warunkami, aby przyznać graczom różne medale w zależności od ich wyników. Użyj instrukcji if i dwóch instrukcji elseif, aby sprawdzić czas ukończenia gracza i przyznać im odpowiedni medal.
Aby potwierdzić, że każda medal może być przyznana, użyj poleceń wydruku.
local function finish()raceActive = falseprint("Ukończyłeś w " .. timePassed)endAby przyznać złoty medal, zakoduj instrukcję if, która porównuje timePassed z pożądanym czasem ukończenia. Ten przykład sprawdza, czy czas gracza był mniejszy lub równy 10 sekund.
local function finish()raceActive = falseprint("Ukończyłeś w " .. timePassed)if timePassed <= 10 thenprint("Otrzymujesz złoty medal!")endendPrzetestuj i potwierdź, że złoty medal może być przyznany.
Dodaj dodatkowe warunki
Teraz, gdy przetestowałeś złoty medal, zakoduj warunki dla innych medali, używając słowa kluczowego elseif.
Dla srebrnego medalu użyj elseif i następnego pożądanego zakresu czasowego. W tym przykładzie zakres jest większy niż 10 sekund, ale mniejszy lub równy 20 sekund.
local function finish()raceActive = falseprint("Ukończyłeś w " .. timePassed)if timePassed <= 10 thenprint("Otrzymujesz złoty medal!")elseif timePassed > 10 and timePassed <= 20 thenprint("Otrzymujesz srebrny medal!")endendUżyj tego samego wzoru dla brązowego medalu. Sprawdź swój kod z poniższym przykładem.
local function finish()raceActive = falseprint("Ukończyłeś w " .. timePassed)if timePassed <= 10 thenprint("Otrzymujesz złoty medal!")elseif timePassed > 10 and timePassed <= 20 thenprint("Otrzymujesz srebrny medal!")elseif timePassed > 20 and timePassed <= 30 thenprint("Otrzymujesz brązowy medal!")endendPrzetestuj srebrne i brązowe medale.
Wskazówki dotyczące rozwiązywania problemów
Jeśli nie widzisz srebrnych i brązowych medali, spróbuj jednego z poniższych.
- Każde elseif powinno mieć then po swoim warunku.
- W partTouched(), upewnij się, że drugi warunek instrukcji if używa ==, jak w raceActive == true.
- Sprawdź, czy każde elseif jest w zakresie. Każdy warunek elseif musi znajdować się między pierwszą linią instrukcji if/then a ostatnim end.
Dodaj warunek else
Jeśli gracz nie zdobył żadnego medalu, powinieneś zachęcić go do spróbowania ponownie. W takim przypadku możesz użyć instrukcji else, która uruchamia się, jeśli żadne inne warunki nie są prawdziwe, aby pokazać im wiadomość.
Poniżej ostatniego elseif i powyżej end, rozpocznij nową linię i wpisz else. Nie dodawaj then. Pod else użyj polecenia wydruku, aby zachęcić ich do spróbowania ponownie.
local function finish()raceActive = falseprint("Ukończyłeś w " .. timePassed)if timePassed <= 10 thenprint("Otrzymujesz złoty medal!")elseif timePassed > 10 and timePassed <= 20 thenprint("Otrzymujesz srebrny medal!")elseif timePassed > 20 and timePassed <= 30 thenprint("Otrzymujesz brązowy medal!")elseprint("Spróbuj ponownie!")endendPrzetestuj, aby zobaczyć wiadomość else.
Podsumowanie
Struktury kontrolne mogą mieć więcej niż jeden scenariusz. Użyj instrukcji if, aby ustawić początkowe oświadczenie do sprawdzenia, a następnie dodaj tyle warunków elseif, ile potrzebujesz. Na koniec użyj else, aby określić, co powinno się wydarzyć, jeśli wszystkie podane warunki są fałszywe.
Zaczynając od góry, wszystkie warunki będą sprawdzane, a tylko pierwszy prawdziwy warunek uruchomi kod. Pozostałe warunki nie będą sprawdzane, ani ich kod nie zostanie uruchomiony.
Po zakończeniu projektu możesz rozszerzyć skrypt, aby dodać nowe elementy na kilka dodatkowych sposobów.
- Dodaj kod, aby gracze mogli powtórzyć wyścig, dotykając linii startowej, gdy ukończą.
- Zaprojektuj sposób wyświetlania czasu podczas wyścigu. Możesz wyświetlić czas na części za pomocą Surface GUI, jak w Stwórz czasowy mostek tutorial.
local timePassed = 0
local finishLine = script.Parent
-- Używane do zapobiegania powtarzaniu finish() i timera, gdy wyścig się kończy
local raceActive = true
-- Uruchamia się, gdy gracz dotyka linii mety i pokazuje im nagrodę
local function finish()
raceActive = false
print("Ukończyłeś w " .. timePassed)
if timePassed <= 10 then
print("Otrzymujesz złoty medal!")
elseif timePassed > 10 and timePassed <= 20 then
print("Otrzymujesz srebrny medal!")
elseif timePassed > 20 and timePassed <= 30 then
print("Otrzymujesz brązowy medal!")
else
print("Spróbuj ponownie!")
end
end
-- Sprawdza, czy gracz dotyka części, gdy wyścig jest aktywny
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)
-- Śledzi czas wyścigu, gdy wyścig jest aktywny. Musi być na dole skryptu.
while raceActive == true do
task.wait(1)
timePassed += 1
print(timePassed)
end