Instrukcja switch dla stanu
Część sekcji Tworzenie prawdziwych gier ścieżki Unity w Coddy. Lekcja 15 z 60.
Każdy stan gry wykonuje inne zadania w każdej klatce. Instrukcja switch dla pola stanu umieszcza te zadania w osobnej gałęzi dla każdego stanu, a w każdej klatce wykonywana jest dokładnie jedna gałąź. Zmiana stanu odbywa się za pomocą jednej metody, dzięki czemu ekran zawsze odpowiada stanowi. Ta walka z bossem ma 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żda gałąź kończy się instrukcją break, ponieważ C# nie pozwala skompilować gałęzi, która przechodzi do następnej. Gdy upłynie czas wprowadzenia, Enter(Phase.Fight) zmienia fazę, ale gałąź Fight zostanie wykonana dopiero w następnej klatce, ponieważ ta klatka już wybrała swoją gałąź. Gdyby zamiast tego użyć kolejno osobnych bloków if, w jednej klatce mogłoby rozpocząć się starcie i zostać wykonany kod walki.
Enter to jedyne miejsce, w którym zmieniana jest wartość phase. Wyrażenie next == Phase.Fight ma wartość true tylko dla panelu walki, więc jedno wywołanie wyświetla ten panel i ukrywa pozostałe dwa. Zadania związane z wejściem w dany stan, takie jak zresetowanie licznika czasu, również umieszcza się w Enter; są wtedy wykonywane raz, a nie w każdej klatce.
Wyzwanie
ŁatwyPrzygotuj 5-sekundowy wyścig stukania.
- W
SetStatepokazuj tylko panel nowego stanu. Wejście w stan Playing ustawiataps = 0,timeLeft = roundTimeiTaps: 0; wejście w stan GameOver wyświetlaTaps: 3wresultText. - W
Update()użyjswitch (state): naciśnięcie spacji przenosi ze stanu Ready do Playing, a ze stanu GameOver do Ready; w stanie Playing każde naciśnięcie spacji zwiększa wartość wtapsitapsText, aż upłynie czas.
Naciśnij „Graj” i ścigaj się dwa razy. Następnie naciśnij „Sprawdź”.
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 upłynie, gra się kończy
// GameOver: Space wraca do Ready
}
void SetState(GameState next)
{
state = next;
// wyświetl tylko panel nowego stanu
// nowa runda zaczyna się od 0 naciśnięć i trwa roundTime sekund; na końcu resultText pokazuje liczbę naciśnięć
}
}
Wszystkie lekcje w sekcji Tworzenie prawdziwych gier
1Tekst na ekranie
Canvas i tekstWyświetlanie wynikuFormatowanie liczbOdliczanie czasuPowtórka: prędkościomierz2Przyciski 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ąPoćwicz samodzielnie: Edytor online Unity