Menu
CoddyTech

Juega otra vez

Lección 12 de 14 del curso Juego de Unity: Snake 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

El HUD tiene un GameOverPanel oculto con un PlayAgainButton, y la escena configura ambos en GameManager.

  1. En GameManager, añade using UnityEngine.UI;, using UnityEngine.SceneManagement;, public GameObject gameOverPanel; y public Button playAgainButton;.
  2. Escribe public void GameOver(), que muestra el panel.
  3. Escribe void PlayAgain(), que vuelve a cargar la escena activa, y en Start() haz que el botón lo llame.
  4. En Die() de Snake, llama a GameOver().

Pulsa Jugar, choca, vuelve a jugar y 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: Snake 3D