Menu
CoddyTech

Gioca ancora

Lezione 12 di 14 del corso Gioco 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

Quando il serpente muore, viene mostrato un pannello di fine partita e «Gioca di nuovo» avvia una nuova partita.

  1. In GameManager, aggiungi using UnityEngine.UI;, using UnityEngine.SceneManagement;, public GameObject gameOverPanel; e public Button playAgainButton;
  2. public void GameOver() mostra il pannello; void PlayAgain() ricarica la scena attiva e Start() aggiunge un listener a playAgainButton.onClick.
  3. Die() di Snake chiama GameManager.Instance.GameOver().

Premi Gioca, urta un ostacolo e fai clic su Gioca di nuovo: inizia una nuova partita. Poi premi Verifica.

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 Unity: Snake 3D

Esercitati da solo: Playground Unity