Alternando o Estado
Parte da seção Criando jogos de verdade do Journey de Unity da Coddy. Lição 15 de 56.
Cada estado de um jogo executa um trabalho diferente a cada quadro. Um switch no campo de estado coloca esse trabalho em um case por estado, e cada quadro executa exatamente um case. A mudança de estado passa por um único método, então a tela sempre corresponde ao estado. Esta luta contra o chefe tem uma introdução, a luta e uma tela de vitória:
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);
}
}Cada case termina com break, porque C# se recusa a compilar um case que continua executando o próximo. Quando o cronômetro da introdução acaba, Enter(Phase.Fight) muda a fase, mas o case Fight só é executado no quadro seguinte, porque este quadro já escolheu seu case. Com blocos if separados, um após o outro, um quadro poderia iniciar a luta e executar o código da luta no mesmo quadro.
Enter é o único lugar que altera phase. next == Phase.Fight é true apenas para o painel da luta, então uma chamada exibe esse painel e oculta os outros dois. O trabalho que pertence à entrada em um estado, como redefinir um cronômetro, também fica em Enter e é executado uma vez, em vez de a cada quadro.
Desafio
FácilUma competição de toques: quantas vezes você consegue pressionar Espaço em 5 segundos? O GameManager tem o enum GameState (Ready, Playing, GameOver), um painel para cada estado, e Start chama SetState(GameState.Ready). Escreva Update e SetState.
Em Update, use um switch em state:
- Ready: Espaço inicia uma rodada. Essa pressão não conta como toque.
- Playing: cada pressão de Espaço adiciona 1 a
tapse exibe o valor emtapsText, comoTaps: 3. ApósroundTimesegundos (5), o jogo termina. - GameOver: Espaço volta para Ready.
SetState(GameState next) define state e exibe apenas o painel do novo estado. Ao entrar em Playing, inicia uma rodada com 0 toques, Taps: 0 na tela e roundTime segundos restantes; ao entrar em GameOver, exibe o resultado em resultText, como Taps: 3.
Pressione Jogar, participe de duas rodadas e depois Verificar.
Experimente você mesmo
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()
{
// selecione conforme o estado:
// Ready: Space inicia uma rodada
// Playing: Space conta um toque; quando o tempo acaba, o jogo termina
// GameOver: Space volta para Ready
}
void SetState(GameState next)
{
state = next;
// mostre apenas o painel do novo estado
// uma nova rodada começa com 0 toques e roundTime segundos; ao final, resultText mostra a quantidade de toques
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Criando jogos de verdade
1Texto na tela
Canvas e textoExiba a pontuaçãoFormate númerosUm cronômetro regressivoRevisão: velocímetro4Cenas e Fases
Carregar uma CenaReiniciar a FasePróxima FaseManter entre CenasRevisão: Seleção de Fases10Projeto: Jogo de Plataforma 3D
O PercursoPlataformas Móveis2Botões e telas
Botões e onClickLambdasConectando no InspectorPainéis ligados e desligadosBarras de vidaRevisão: Loja de melhorias5Salvando com PlayerPrefs
Salvar um númeroCarregar com um valor padrãoRecordeSalvar configuraçõesRevisão: Moedas no banco3O Gerenciador do Jogo
Um Script Controla o JogoO SingletonEstados do JogoAlternando o EstadoRevisão: Gerenciador de Rodadas6Projeto: Corredor Infinito
Três FaixasObstáculos à Frente