Menu
CoddyTech

Ночь выживания

Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 56 из 56.

Выживший стоит в тёмном поле, а всю ночь на него налетают летучие мыши — каждые пару секунд появляется новая из одного из четырёх углов поля. Каждая летучая мышь летит прямо на выжившего, и та, что первой доберётся до него, завершит ночь. Часы вверху отсчитывают секунды до рассвета: продержись до него — и победа за тобой. Кнопка Pause останавливает всё, а когда ночь заканчивается, кнопка Play again начинает новую.

Скрипт Player, который перемещает выжившего с помощью действия Move, уже написан. Напиши GameManager и Bat.

challenge icon

Задание

Сложно

В Inspector задаются значения для GameManager: nightLength (15), spawnEvery (2), batPrefab, spawnPoints (четыре угла), dawnText, pauseButton, pausePanel, endPanel, endText и restartButton.

  • Это синглтон (public static GameManager Instance), у которого есть вложенный public enum State со значениями Playing, Paused, Won и Lost, а также public State state. Ночь начинается в состоянии Playing.
  • Пока игра находится в состоянии Playing: число оставшихся секунд уменьшается от nightLength; оно отображается с округлением вверх, например, как Dawn in 12. Каждые spawnEvery секунд летучая мышь появляется в одной из точек spawnPoints, выбранной случайным образом. Когда время заканчивается, ночь считается выигранной.
  • pauseButton переключает состояние с Playing на Paused и обратно. В состоянии Paused время игры останавливается (Time.timeScale 0) и отображается pausePanel; при возвращении в Playing время снова идёт, а панель скрывается. В состояниях Won или Lost кнопка ничего не делает.
  • Публичный метод Lose() переводит ночь из состояния Playing в Lost.
  • В состояниях Won и Lost время игры останавливается, а на экране появляется endPanel с текстом endText: You survived the night! или The bats got you.
  • restartButton начинает новую ночь, повторно загружая сцену.

В Inspector задаются значения для Bat: speed (2) и reach (1). Пока игра находится в состоянии Playing, летучая мышь летит к игроку (с тегом Player), двигаясь со скоростью speed и сохраняя свою высоту. Когда она оказывается от игрока на плоскости земли на расстоянии меньше reach, она вызывает Lose().

Нажми Play и попробуй продержаться до рассвета, затем нажми Check.

Попробуйте сами

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using TMPro;

public class GameManager : MonoBehaviour
{
    public float nightLength = 15f;
    public float spawnEvery = 2f;
    public GameObject batPrefab;
    public Transform[] spawnPoints;
    public TMP_Text dawnText;
    public Button pauseButton;
    public GameObject pausePanel;
    public GameObject endPanel;
    public TMP_Text endText;
    public Button restartButton;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Создание настоящих игр