Menu
CoddyTech

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.

challenge icon

Desafio

Fácil

Uma 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 taps e exibe o valor em tapsText, como Taps: 3. Após roundTime segundos (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
    }
}
quiz iconTeste seus conhecimentos

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