Menu
CoddyTech

Selezionare lo stato

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

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 cambiamento 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# rifiuta di compilare un case che prosegue nel successivo. Quando il timer dell'introduzione si esaurisce, 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à scelto 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 viene modificato phase. next == Phase.Fight è true solo per il pannello dello scontro, quindi una chiamata mostra quel pannello e nasconde gli altri due. Anche le operazioni che devono essere eseguite quando si entra in uno stato, come azzerare un timer, vanno in Enter e vengono eseguite una sola volta invece che a ogni fotogramma.

challenge icon

Sfida

Facile

Prepara la gara di tocchi di 5 secondi.

  1. In SetState, mostra solo il pannello del nuovo stato. Entrando in Playing, imposta taps = 0, timeLeft = roundTime e Taps: 0; entrando in GameOver, mostra Taps: 3 in resultText.
  2. In Update(), switch (state): la barra spaziatrice porta da Ready a Playing e da GameOver a Ready; in Playing, ogni pressione della barra spaziatrice viene conteggiata in taps e tapsText fino allo scadere del tempo.

Premi «Gioca» e fai due gare. Poi premi «Verifica».

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()
    {
        // seleziona in base a state:
        // Ready: Space avvia un round
        // Playing: Space conta un tocco; quando il tempo scade, 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
    }
}

Tutte le lezioni di Creare veri giochi

Esercitati da solo: Playground Unity