Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy

Przygotuj 5-sekundowy wyścig stukania.

  1. W SetState pokazuj tylko panel nowego stanu. Wejście w stan Playing ustawia taps = 0, timeLeft = roundTime i Taps: 0; wejście w stan GameOver wyświetla Taps: 3 w resultText.
  2. W Update() użyj switch (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ść w taps i tapsText, 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

Poćwicz samodzielnie: Edytor online Unity