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.
Wyzwanie
ŚredniHUD ma ukryty panel GameOverPanel z przyciskiem PlayAgainButton, a scena ustawia oba te elementy w GameManager.
- W
GameManagerdodajusing UnityEngine.UI;,using UnityEngine.SceneManagement;,public GameObject gameOverPanel;orazpublic Button playAgainButton;. - Napisz
public void GameOver(), który wyświetla panel. - Napisz
void PlayAgain(), który ponownie ładuje aktywną scenę, a wStart()spraw, aby przycisk go wywoływał. - W
Die()klasySnakewywołajGameOver().
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)];
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.