Menu
CoddyTech

Zagraj ponownie

Lekcja 12 z 14 w kursie Gra w Unity: Wąż 3D w Coddy.

Gdy wąż ginie, pojawia się panel końca gry z przyciskiem Zagraj ponownie. Panel znajduje się w HUD i początkowo jest ukryty, a SetActive(true) go wyświetla. Wąż wie, kiedy ginie, a GameManager zarządza ekranami, więc Die() wywołuje publiczną metodę GameOver() w GameManagerze.

Przycisk Zagraj ponownie rozpoczyna grę od nowa, ponownie wczytując scenę. Wszystkie obiekty wracają do stanu określonego przez scenę: wąż znajduje się na pierwszym polu i ma dwa segmenty, wynik wynosi 0, a panel jest ukryty. Przycisk Ponów próbę w grze wyścigowej jest podłączony w ten sam sposób:

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

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

Wczytywanie po nazwie wiąże przycisk z jedną sceną. SceneManager.GetActiveScene().buildIndex zwraca indeks aktualnie uruchomionej sceny, więc wczytanie jej uruchamia ponownie dowolną scenę, w której znajduje się przycisk. Nowa scena ma nowy GameManager, którego Awake() ponownie ustawia Instance, dzięki czemu nowy wąż komunikuje się z nowym GameManagerem.

challenge icon

Wyzwanie

Średni

HUD ma ukryty panel GameOverPanel z przyciskiem PlayAgainButton, a scena ustawia oba te elementy w GameManager.

  1. W GameManager dodaj using UnityEngine.UI;, using UnityEngine.SceneManagement;, public GameObject gameOverPanel; oraz public Button playAgainButton;.
  2. Napisz public void GameOver(), który wyświetla panel.
  3. Napisz void PlayAgain(), który ponownie ładuje aktywną scenę, a w Start() spraw, aby przycisk go wywoływał.
  4. W Die() klasy Snake wywołaj GameOver().

Naciśnij Play, rozbij się, zagraj ponownie, a następnie naciśnij Check.

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Gra w Unity: Wąż 3D