Menu
CoddyTech

Selezionare lo stato

Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 15 di 56.

Ogni stato di un gioco svolge un lavoro diverso a ogni fotogramma. Uno switch sul campo dello stato inserisce quel lavoro in un case per ogni stato e a ogni fotogramma viene eseguito esattamente un case. Il cambio di stato passa attraverso un unico metodo, così la schermata corrisponde sempre allo stato. Questo scontro con un boss ha un'introduzione, lo scontro e una schermata di vittoria:

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);
    }
}

Ogni case termina con break, perché C# non compila un case che prosegue nel successivo. Quando il timer dell'introduzione scade, Enter(Phase.Fight) cambia la fase, ma il case Fight viene eseguito per la prima volta solo nel fotogramma successivo, perché questo fotogramma ha già selezionato il proprio case. Con blocchi if separati uno dopo l'altro, un fotogramma potrebbe avviare lo scontro ed eseguire il codice dello scontro nello stesso fotogramma.

Enter è l'unico punto in cui cambia phase. next == Phase.Fight è true solo per il pannello dello scontro, quindi una chiamata mostra quel pannello e nasconde gli altri due. Anche il lavoro che deve essere svolto entrando in uno stato, come azzerare un timer, va in Enter e viene eseguito una sola volta anziché a ogni fotogramma.

challenge icon

Sfida

Facile

Una gara di tocchi: quante volte riesci a premere Space in 5 secondi? GameManager contiene l'enum GameState (Ready, Playing, GameOver), un pannello per ogni stato e Start chiama SetState(GameState.Ready). Scrivi Update e SetState.

In Update, usa uno switch su state:

  • Ready: Space avvia un round. Quella pressione non è un tocco.
  • Playing: ogni pressione di Space aggiunge 1 a taps e lo mostra in tapsText, come Taps: 3. Dopo roundTime secondi (5), la partita finisce.
  • GameOver: Space torna a Ready.

SetState(GameState next) imposta state e mostra solo il pannello del nuovo stato. Entrando in Playing, avvia un round con 0 tocchi, Taps: 0 sullo schermo e roundTime secondi rimanenti; entrando in GameOver, mostra il risultato in resultText, come Taps: 3.

Premi Play, gareggia due volte, poi premi Check.

Provalo tu

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()
    {
        // gestisci i casi in base a state:
        // Ready: Space avvia un round
        // Playing: Space conta un tocco; allo scadere del tempo, la partita finisce
        // GameOver: Space torna a Ready
    }

    void SetState(GameState next)
    {
        state = next;
        // mostra solo il pannello del nuovo stato
        // un nuovo round inizia con 0 tocchi e roundTime secondi; alla fine, resultText mostra il numero di tocchi
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Creare veri giochi