Menu
CoddyTech

Gioca ancora

Lezione 12 di 14 del corso Gioco in Unity: Snake 3D di Coddy.

Quando il serpente muore, appare un pannello Game Over con un pulsante Gioca di nuovo. Il pannello si trova nell'HUD e all'inizio è nascosto, e SetActive(true) lo mostra. Il serpente sa quando muore e il GameManager gestisce le schermate, quindi Die() chiama un metodo pubblico GameOver() sul GameManager.

Gioca di nuovo ricomincia caricando di nuovo la scena. Ogni oggetto torna nello stato in cui si trova nella scena: il serpente nella sua prima cella con due segmenti, il punteggio a 0, il pannello nascosto. Il pulsante Riprova di un gioco di corse è collegato allo stesso modo:

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

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

Caricare per nome collega il pulsante a una sola scena. SceneManager.GetActiveScene().buildIndex è la scena in esecuzione, quindi caricarla riavvia la scena in cui si trova il pulsante. La nuova scena ha un nuovo GameManager, il cui Awake() imposta di nuovo Instance, così il nuovo serpente comunica con il nuovo GameManager.

challenge icon

Sfida

Medio

L'HUD ha un GameOverPanel nascosto con un PlayAgainButton, e la scena imposta entrambi su GameManager.

  1. In GameManager, aggiungi using UnityEngine.UI;, using UnityEngine.SceneManagement;, public GameObject gameOverPanel; e public Button playAgainButton;.
  2. Scrivi public void GameOver(), che mostra il pannello.
  3. Scrivi void PlayAgain(), che ricarica la scena attiva, e in Start() fai in modo che il pulsante la richiami.
  4. In Die() di Snake, richiama GameOver().

Premi Play, schiantati, gioca di nuovo, poi premi Check.

Provalo tu

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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gioco in Unity: Snake 3D