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.
Sfida
FacilePrepara la gara di tocchi di 5 secondi.
- In
SetState, mostra solo il pannello del nuovo stato. Entrando in Playing, impostataps = 0,timeLeft = roundTimeeTaps: 0; entrando in GameOver, mostraTaps: 3inresultText. - 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 intapsetapsTextfino 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
1Testo sullo schermo
Canvas e testoMostra il punteggioFormattare i numeriUn timer per il conto alla rovesciaRiepilogo: tachimetro2Pulsanti e schermate
Pulsanti e onClickLambdaCollegare nell'InspectorPannelli attivi e disattiviBarre della saluteRiepilogo: negozio degli upgrade5Salvare con PlayerPrefs
Salvare un numeroCaricare con un valore predefinitoPunteggio massimoSalvare le impostazioniRiepilogo: monete in banca8Controller del personaggio
CharacterController.MoveGravità manualeSaltoSpingere gli oggettiMuoviti dove guardiRiepilogo: doppio salto3Il gestore del gioco
Uno script gestisce il giocoIl SingletonStati di giocoSelezionare lo statoRiepilogo: gestore del round6Progetto: Runner infinito
Tre corsieOstacoli in arrivo9Il nuovo sistema di input
Due sistemi di inputTastiera e mousePremuto in questo frameAzioni di inputRiepilogo: cambio di inputEsercitati da solo: Playground Unity