Menu
CoddyTech

Activar el estado

Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 15 de 60.

Cada estado de un juego realiza un trabajo distinto 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 solo método, de modo que la pantalla siempre coincide con el estado. Esta pelea contra un jefe tiene una introducción, la pelea 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úa ejecutándose en el siguiente. Cuando se agota el temporizador de la introducción, Enter(Phase.Fight) cambia la fase, pero el caso Fight se ejecuta primero en el siguiente fotograma, porque este fotograma ya ha elegido su caso. Con bloques if separados, uno tras otro, un fotograma podría iniciar la pelea y ejecutar el código de la pelea en ese mismo fotograma.

Enter es el único lugar que cambia phase. next == Phase.Fight es true solo para el panel de la pelea, así que una llamada muestra ese panel y oculta los otros dos. El trabajo que corresponde a entrar en un estado, como reiniciar un temporizador, también va en Enter y se ejecuta una vez en lugar de en cada fotograma.

challenge icon

Desafío

Fácil

Crea la carrera de toques de 5 segundos.

  1. En SetState, muestra solo el panel del nuevo estado. Al entrar en Playing, establece taps = 0, timeLeft = roundTime y Taps: 0; al entrar en GameOver, muestra Taps: 3 en resultText.
  2. En Update(), switch (state): la barra espaciadora cambia Ready a Playing y GameOver a Ready; Playing cuenta cada pulsación de la barra espaciadora en taps y tapsText hasta que se agote el tiempo.

Pulsa «Jugar» y compite dos veces. Después, pulsa «Comprobar».

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 el valor de 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
    }
}

Todas las lecciones de Creación de juegos reales

Practica por tu cuenta: Playground de Unity