Играть снова
Урок 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.
Задание
СреднеПри гибели появляется панель окончания игры, а кнопка «Играть снова» начинает новую игру.
- В
GameManagerдобавьusing UnityEngine.UI;,using UnityEngine.SceneManagement;,public GameObject gameOverPanel;иpublic Button playAgainButton; public void GameOver()показывает панель;void PlayAgain()загружает активную сцену заново, а Start() добавляет обработчик вplayAgainButton.onClick.- Метод
Die()классаSnakeвызываетGameManager.Instance.GameOver().
Нажми «Играть», врежься и нажми «Играть снова»: начнётся новая игра. Затем нажми «Проверить».
Попробуйте сами
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)];
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Игра на Unity: 3D-змейка
Потренируйтесь самостоятельно: Песочница Unity