Estados do Jogo
Parte da seção Criando Jogos de Verdade do Journey de Unity da Coddy. Lição 14 de 60.
Um jogo fica em um estado por vez: aguardando o jogador, em execução ou encerrado. Dois valores bool, como isPlaying e isOver, podem acabar sendo true ao mesmo tempo por engano, e uma string como "Playng" compila, mas nunca corresponde ao valor esperado. C# tem um tipo para uma lista fixa de opções: o enum. Este semáforo usa um:
public enum Signal { Red, Yellow, Green }
public class Crossing : MonoBehaviour
{
public Signal signal;
void Update()
{
if (signal == Signal.Red && Input.GetMouseButtonDown(0))
{
signal = Signal.Green;
Debug.Log("Walk!");
}
}
public bool CanWalk()
{
return signal == Signal.Green;
}
}enum Signal { Red, Yellow, Green } cria um novo tipo com exatamente três valores, escritos como Signal.Red, Signal.Yellow e Signal.Green. Um campo Signal guarda um deles por vez; você o compara com == e o altera com =. Um erro de digitação como Signal.Gren gera um erro de compilação, então o problema aparece antes de você pressionar “Jogar”.
O enum é declarado fora da classe, então qualquer script pode usar Signal, e o script de um pedestre pode consultar crossing.CanWalk(). Um novo campo enum começa com o primeiro valor, neste caso, Red. No Inspector, um campo enum público aparece como uma lista suspensa com seus valores. Internamente, cada valor é um número contado a partir de 0: (int)Signal.Green é 2.
Desafio
FácilDefina três estados para a travessia da lava.
- Declare
public enum GameState { Ready, Playing, GameOver }acima da classe GameManager epublic GameState state;nela. - Em
Update(), enquanto estiver no estado Ready, a tecla Space define o estado como Playing e registraGo!. EmHitLava(), enquanto estiver no estado Playing, defina o estado como GameOver e registreGame over. - Em
Player.cs, leia as teclas de direção somente quandoGameManager.Instance.state == GameState.Playing.
Pressione “Jogar”: as teclas de direção aguardam a tecla Space. Depois, pressione “Verificar”.
Experimente você mesmo
using UnityEngine;
// Declare o enum GameState aqui: Ready, Playing, GameOver
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
// um campo público GameState chamado state
void Awake()
{
Instance = this;
}
void Update()
{
// Enquanto estiver em Ready, Space inicia o jogo e registra Go!
}
public void HitLava()
{
// Enquanto estiver em Playing, o jogo termina: registre Game over
}
}
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ímetro2Botõ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 RodadasPratique por conta própria: Playground de Unity