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.
Sfida
FacileUna 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
tapse lo mostra intapsText, comeTaps: 3. DoporoundTimesecondi (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
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Creare veri giochi
1Testo sullo schermo
Canvas e testoMostra il punteggioFormattare i numeriUn timer per il conto alla rovesciaRiepilogo: tachimetro4Scene e livelli
Caricare una scenaRiavviare il livelloLivello successivoMantenere i dati tra le sceneRiepilogo: selezione del livello10Progetto: Platform 3D
Il percorsoPiattaforme mobili2Pulsanti 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: Corsa infinita
Tre corsieOstacoli in arrivo9Il nuovo sistema di input
Due sistemi di inputTastiera e mousePremuto in questo frameAzioni di inputRiepilogo: cambio di input