Menu
CoddyTech

Juega otra vez

Lección 12 de 14 del curso Juego de Unity: Serpiente 3D de Coddy.

Cuando la serpiente muere, aparece un panel de fin de partida con un botón para volver a jugar. El panel está en el HUD y empieza oculto; SetActive(true) lo muestra. La serpiente sabe cuándo muere, y GameManager se encarga de las pantallas, así que Die() llama a un método público GameOver() de GameManager.

Volver a jugar empieza de nuevo cargando otra vez la escena. Todos los objetos vuelven tal como están en la escena: la serpiente en su primera celda con dos segmentos, la puntuación en 0 y el panel oculto. El botón Retry de un juego de carreras se conecta de la misma manera:

void Start()
{
    retryButton.onClick.AddListener(Retry);
}

void Retry()
{
    SceneManager.LoadScene("Track1");
}

Cargar por nombre vincula el botón a una sola escena. SceneManager.GetActiveScene().buildIndex es la escena que está en ejecución, así que cargarla reinicia la escena en la que esté el botón. La nueva escena tiene un GameManager nuevo, cuyo Awake() vuelve a establecer Instance, así que la nueva serpiente se comunica con el nuevo GameManager.

challenge icon

Desafío

Intermedio

Al morir, se muestra un panel de Game Over y «Jugar otra vez» inicia una nueva partida.

  1. En GameManager, añade using UnityEngine.UI;, using UnityEngine.SceneManagement;, public GameObject gameOverPanel; y public Button playAgainButton;
  2. public void GameOver() muestra el panel; void PlayAgain() vuelve a cargar la escena activa, y Start() lo añade a playAgainButton.onClick.
  3. El método Die() de Snake llama a GameManager.Instance.GameOver().

Pulsa «Jugar», choca y haz clic en «Jugar otra vez»: se inicia una nueva partida. Después, pulsa «Comprobar».

Pruébalo tú mismo

using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public Snake snake;
    public GameObject foodPrefab;
    public TMP_Text scoreText;
    private Transform food;
    private int score;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        scoreText.text = "Score: 0";
        food = Instantiate(foodPrefab).transform;
        MoveFood();
    }

    public bool IsFood(Vector3 cell)
    {
        return cell == food.position;
    }

    public void Eat()
    {
        score++;
        scoreText.text = "Score: " + score;
        MoveFood();
    }

    void MoveFood()
    {
        List<Vector3> free = new List<Vector3>();
        for (int x = -snake.edge; x <= snake.edge; x++)
        {
            for (int z = -snake.edge; z <= snake.edge; z++)
            {
                Vector3 cell = new Vector3(x, 0f, z);
                if (!snake.Occupies(cell))
                {
                    free.Add(cell);
                }
            }
        }
        food.position = free[Random.Range(0, free.Count)];
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Juego de Unity: Serpiente 3D

Practica por tu cuenta: Playground de Unity