Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy

Wyś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 taps o 1 i wyświetla tę wartość w tapsText w postaci Taps: 3. Po roundTime sekundach (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ęć
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Tworzenie prawdziwych gier