Activar el estado
Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 15 de 56.
Cada estado de un juego realiza un trabajo diferente en cada fotograma. Un switch sobre el campo de estado coloca ese trabajo en un caso por estado, y cada fotograma ejecuta exactamente un caso. El cambio de estado se realiza mediante un único método, por lo que la pantalla siempre coincide con el estado. Esta pelea contra un jefe tiene una introducción, el combate y una pantalla de victoria:
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 caso termina con break, porque C# no permite compilar un caso que continúe directamente con el siguiente. Cuando se agota el temporizador de la introducción, Enter(Phase.Fight) cambia la fase, pero el caso Fight se ejecuta por primera vez en el fotograma siguiente, porque este fotograma ya ha elegido su caso. Con varios bloques if uno tras otro, un fotograma podría iniciar el combate y ejecutar el código del combate en ese mismo fotograma.
Enter es el único lugar que cambia phase. next == Phase.Fight es true únicamente para el panel del combate, así que una llamada muestra ese panel y oculta los otros dos. El trabajo que corresponde a la entrada en un estado, como reiniciar un temporizador, también va en Enter y se ejecuta una vez en lugar de en cada fotograma.
Desafío
FácilUna carrera de pulsaciones: ¿cuántas veces puedes presionar la barra espaciadora en 5 segundos? GameManager tiene el enum GameState (Ready, Playing, GameOver), un panel para cada estado y Start llama a SetState(GameState.Ready). Escribe Update y SetState.
En Update, usa una instrucción switch sobre state:
- Ready: la barra espaciadora inicia una ronda. Esa pulsación no cuenta.
- Playing: cada pulsación de la barra espaciadora suma 1 a
tapsy lo muestra entapsText, comoTaps: 3. Después deroundTimesegundos (5), el juego termina. - GameOver: la barra espaciadora vuelve a Ready.
SetState(GameState next) establece state y muestra solo el panel del nuevo estado. Al entrar en Playing, inicia una ronda con 0 pulsaciones, muestra Taps: 0 en la pantalla y deja roundTime segundos; al entrar en GameOver, muestra el resultado en resultText, como Taps: 3.
Presiona Play, compite dos veces y después presiona Check.
Pruébalo tú mismo
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()
{
// según state:
// Ready: Space inicia una ronda
// Playing: Space cuenta un toque; cuando se acaba el tiempo, termina la partida
// GameOver: Space vuelve a Ready
}
void SetState(GameState next)
{
state = next;
// muestra solo el panel del nuevo estado
// una nueva ronda comienza con 0 toques y roundTime segundos; al final, resultText muestra los toques
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Creación de juegos reales
1Texto en pantalla
Canvas y textoMuestra la puntuaciónDa formato a los númerosUn temporizador de cuenta regresivaRepaso: velocímetro4Escenas y niveles
Cargar una escenaReiniciar el nivelSiguiente nivelConservar entre escenasRepaso: selección de nivel10Proyecto: plataformas 3D
El recorridoPlataformas móviles2Botones y pantallas
Botones y onClickLambdasConectar en el InspectorPaneles activados y desactivadosBarras de saludRepaso: tienda de mejoras5Guardar con PlayerPrefs
Guardar un númeroCargar con un valor predeterminadoPuntuación más altaGuardar ajustesRepaso: monedas en el banco3El gestor del juego
Un solo script ejecuta el juegoEl SingletonEstados del juegoActivar el estadoRepaso: gestor de rondas6Proyecto: corredor infinito
Tres carrilesObstáculos por delante9El nuevo sistema de entrada
Dos sistemas de entradaTeclado y ratónPulsado en este fotogramaAcciones de entradaRepaso: cambio de entrada