Играть снова
Урок 12 из 14 курса Игра на Unity: 3D-змейка на Coddy.
Когда змея погибает, появляется панель Game Over с кнопкой Play Again. Панель находится в HUD и изначально скрыта, а SetActive(true) показывает её. Змея знает, когда погибает, а GameManager управляет экранами, поэтому Die() вызывает публичный метод GameOver() у GameManager.
Play Again начинает игру заново, загружая сцену ещё раз. Все объекты возвращаются в исходное состояние сцены: змея — в первую клетку с двумя сегментами, счёт — на 0, панель — скрыта. Кнопка Retry в гоночной игре подключается таким же образом:
void Start()
{
retryButton.onClick.AddListener(Retry);
}
void Retry()
{
SceneManager.LoadScene("Track1");
}Загрузка по имени привязывает кнопку к одной сцене. SceneManager.GetActiveScene().buildIndex — это индекс запущенной сцены, поэтому её загрузка перезапускает сцену, в которой находится кнопка. В новой сцене появляется новый GameManager, чей Awake() снова устанавливает Instance, поэтому новая змея взаимодействует с новым GameManager.
Задание
СреднеВ HUD есть скрытая панель GameOverPanel с кнопкой PlayAgainButton, и сцена задаёт обе на GameManager.
- В
GameManagerдобавьusing UnityEngine.UI;,using UnityEngine.SceneManagement;,public GameObject gameOverPanel;иpublic Button playAgainButton;. - Напиши
public void GameOver(), которая показывает панель. - Напиши
void PlayAgain(), которая заново загружает активную сцену, а вStart()настрой кнопку так, чтобы она вызывала этот метод. - В методе
Die()уSnakeвызовиGameOver().
Нажми Play, врежься, сыграй снова, затем нажми Check.
Попробуйте сами
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)];
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.