Ночь выживания
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 56 из 56.
Выживший стоит в тёмном поле, а всю ночь на него налетают летучие мыши — каждые пару секунд появляется новая из одного из четырёх углов поля. Каждая летучая мышь летит прямо на выжившего, и та, что первой доберётся до него, завершит ночь. Часы вверху отсчитывают секунды до рассвета: продержись до него — и победа за тобой. Кнопка Pause останавливает всё, а когда ночь заканчивается, кнопка Play again начинает новую.
Скрипт Player, который перемещает выжившего с помощью действия Move, уже написан. Напиши GameManager и Bat.
Задание
СложноВ 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.timeScale0) и отображается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;
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке