Instrukcja switch dla stanu
Część sekcji Tworzenie prawdziwych gier ścieżki Unity w Coddy. Lekcja 15 z 56.
Każdy stan gry wykonuje co klatkę inne zadania. Instrukcja switch sprawdza pole stanu i umieszcza zadania w osobnym przypadku dla każdego stanu, a w każdej klatce uruchamiany jest dokładnie jeden przypadek. Zmiana stanu odbywa się przez jedną metodę, więc ekran zawsze odpowiada stanowi. Ta walka z bossem obejmuje wprowadzenie, walkę i ekran zwycięstwa:
public enum Phase { Intro, Fight, Won }
public class BossFight : MonoBehaviour
{
public GameObject introPanel;
public GameObject fightPanel;
public GameObject winPanel;
public int bossHp = 10;
private Phase phase;
private float timer = 3f;
void Start()
{
Enter(Phase.Intro);
}
void Update()
{
switch (phase)
{
case Phase.Intro:
timer -= Time.deltaTime;
if (timer <= 0f) Enter(Phase.Fight);
break;
case Phase.Fight:
if (bossHp <= 0) Enter(Phase.Won);
break;
case Phase.Won:
break;
}
}
void Enter(Phase next)
{
phase = next;
introPanel.SetActive(next == Phase.Intro);
fightPanel.SetActive(next == Phase.Fight);
winPanel.SetActive(next == Phase.Won);
}
}Każdy przypadek kończy się instrukcją break, ponieważ C# nie pozwala skompilować przypadku, który przechodzi bezpośrednio do następnego. Gdy upłynie czas wprowadzenia, Enter(Phase.Fight) zmienia fazę, ale przypadek Fight uruchamia się dopiero w następnej klatce, ponieważ w tej klatce przypadek został już wybrany. Przy osobnych blokach if umieszczonych jeden po drugim klatka mogłaby rozpocząć walkę i wykonać kod walki w tej samej klatce.
Enter to jedyne miejsce, w którym zmieniana jest wartość phase. next == Phase.Fight ma wartość true tylko dla panelu walki, więc jedno wywołanie pokazuje ten panel i ukrywa dwa pozostałe. Czynności związane z wejściem w stan, takie jak resetowanie licznika czasu, również umieszcza się w Enter; są wtedy wykonywane raz, a nie w każdej klatce.
Wyzwanie
ŁatwyWyścig w klikaniu: ile razy możesz nacisnąć spację w ciągu 5 sekund? GameManager ma wyliczenie GameState (Ready, Playing, GameOver), panel dla każdego stanu, a metoda Start wywołuje SetState(GameState.Ready). Napisz Update i SetState.
W Update użyj instrukcji switch dla state:
- Ready: naciśnięcie spacji rozpoczyna rundę. To naciśnięcie nie jest kliknięciem.
- Playing: każde naciśnięcie spacji zwiększa
tapso 1 i wyświetla tę wartość wtapsTextw postaciTaps: 3. PoroundTimesekundach (5) gra się kończy. - GameOver: naciśnięcie spacji wraca do stanu Ready.
SetState(GameState next) ustawia state i wyświetla tylko panel nowego stanu. Wejście w stan Playing rozpoczyna rundę z 0 kliknięciami, wyświetla na ekranie Taps: 0 i pozostawia roundTime sekund; wejście w stan GameOver wyświetla wynik w resultText w postaci Taps: 3.
Naciśnij Play, rozegraj dwa wyścigi, a następnie naciśnij Check.
Spróbuj swoich sił
using UnityEngine;
using TMPro;
public enum GameState { Ready, Playing, GameOver }
public class GameManager : MonoBehaviour
{
public GameObject readyPanel;
public GameObject playPanel;
public GameObject gameOverPanel;
public TMP_Text tapsText;
public TMP_Text resultText;
public float roundTime = 5f;
public GameState state;
private int taps;
private float timeLeft;
void Start()
{
SetState(GameState.Ready);
}
void Update()
{
// wybierz działanie w zależności od state:
// Ready: Space rozpoczyna rundę
// Playing: Space zlicza naciśnięcie; gdy czas się skończy, gra dobiega końca
// GameOver: Space przywraca stan Ready
}
void SetState(GameState next)
{
state = next;
// pokaż tylko panel nowego stanu
// nowa runda zaczyna się od 0 naciśnięć i trwa roundTime sekund; na koniec resultText pokazuje liczbę naciśnięć
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Tworzenie prawdziwych gier
1Tekst na ekranie
Canvas i tekstWyświetlanie wynikuFormatowanie liczbOdliczanie czasuPowtórka: prędkościomierz4Sceny i poziomy
Wczytaj scenęUruchom poziom ponownieNastępny poziomZachowaj między scenamiPodsumowanie: wybór poziomu10Projekt: platformówka 3D
TrasaRuchome platformy2Przyciski i ekrany
Przyciski i onClickLambdyPodłączanie w InspectorzeWłączanie i wyłączanie paneliPaski zdrowiaPodsumowanie: sklep z ulepszeniami5Zapisywanie za pomocą PlayerPrefs
Zapisz liczbęWczytywanie z wartością domyślnąNajlepszy wynikZapisz ustawieniaPodsumowanie: monety w banku3Menedżer gry
Jeden skrypt obsługuje gręSingletonStany gryInstrukcja switch dla stanuPowtórka: menedżer rund6Projekt: Niekończący się bieg
Trzy toryPrzeszkody przed tobą