Из жизней? Переиграй, чтобы продолжить веселье!

В каждой современной игре есть своего рода экран Game Over. Не осталось жизней? Не достигли главной цели в отведенное время? Закончились патроны и больше не можете защищаться? Такие ситуации чаще всего приводят к экрану Game Over или, по крайней мере, к поведению игры. Что касается Space Shooter, вы столкнетесь с экраном Game Over, когда у вас закончатся жизни.

Давайте сделаем это!

Подготовка к написанию кода
Прежде чем мы начнем реализовывать здесь логику, нам нужны текстовые поля, в которые мы будем писать текст.

  • (2 раза) Щелкните правой кнопкой мыши Canvas › UI › Text
  • Переименуйте GameObjects, чтобы было понятно, что это за текстовое поле. Нам нужно текстовое поле с надписью «GAME OVER» и одно, сообщающее игроку, как перезапустить игру.
  • Измените текст на «GAME OVER» и «Нажмите «R», чтобы перезапустить!»
  • Текст по умолчанию довольно мелкий. Измените размер, чтобы он выглядел привлекательно!
    Я использовал размер 80 для Game Over и размер шрифта 28 для текста перезапуска
  • Вы могли заметить, что текст как будто исчез. Это потому, что текст больше, чем область текстового поля. Здесь мы можем сделать две вещи:
     — (1) использовать инструмент "Прямоугольник" (клавиша "T" в качестве сочетания клавиш), чтобы масштабировать текстовое поле так, чтобы текст соответствовал размеру
     — (2) изменить горизонтальное Переполнение и По вертикали Переполнение на «Переполнение»
  • Поместите текст там, где, по вашему мнению, он подходит.
  • При необходимости настройте цвета и шрифт по своему вкусу.

После этого ваш вид игры может выглядеть так:

Программирование поведения мерцания
Теперь пришло время для веселой части и придания этим текстовым полям некоторого поведения с помощью кода!

Начинаем как всегда, нам нужны две переменные типа Text. Поскольку мы сохраняем все, что связано с пользовательским интерфейсом, в диспетчере пользовательского интерфейса, мы также поместим эти дескрипторы в сценарий UIManager.cs:

Итак, что мы хотим с ними делать?
Мы хотим создать эффект мерцания. Есть несколько способов добиться такого эффекта мерцания, но, поскольку мы хотим сделать его проще, давайте просто изменим отображаемый текст!

  • Эффект мерцания повторяющийся. Следовательно, нам нужно изменить время через указанное количество времени. Для этого идеально подходит сопрограмма!
  • Мы не знаем, как долго игрок будет видеть этот экран или когда запустится повтор. Таким образом, нам нужен бесконечный цикл while.
  • В этом цикле нам нужно изменить отображаемый текст.

Это будет логика, которую мы только что записали:

Вызов метода
Логика есть, но когда она нам действительно нужна?

  • У игрока осталось 0 жизней
  • Это приведет к вызову метода

Помните оператор switch, который мы создали для визуализации жизни текущего игрока в виде спрайтов? Мы исключили часть case 0 . Теперь пришло время заполнить это и вызвать сопрограмму!

  • Нам просто нужно включить оба текстовых поля и позволить им мерцать.

Внутри метода UpdateLives([…]) добавьте эти строки в case 0:

Отключить сообщение GameOver при перезапуске
Теперь текстовые поля мерцают. Однако, когда мы перезапускаем игру, текстовые поля не исчезают.

Это исправляется довольно легко. Нам просто нужно отключить оба GameObject, как только мы начнем игру. Давайте создадим для этого новый метод и вызовем его в void Start():

Теперь у нас есть предполагаемое поведение:

Возможность перезапуска
У игрока не будет редактора Unity, чтобы просто перезапустить игру. Нам нужно создать некоторую логику для этого!

  • Если игрок находится в состоянии Game Over и нажимает клавишу R, игра должна перезагрузиться.
  • Если игрок не находится в состоянии Game Over, нажатие клавиши R ничего не даст.

Чтобы проверить текущее состояние, мы должны создать логическую переменную. Но вместо того, чтобы поместить его в скрипт UIManager, мы создадим новый скрипт GameManager, который будем использовать всякий раз, когда захотим использовать управление сценой.

  • Создайте новый GameManagerGameObject
  • Создайте новый скрипт с именем GameManager.
  • Прикрепите только что созданный скрипт к GameManager GameObject
  • Откройте сценарий

Мы хотим проверить, есть ли у игрока Game Over или нет. Это легко сделать с помощью Boolean! Кроме того, последовательность Game Over хранится в UI Manager. Поэтому нам нужен дескриптор скрипта UI Manager.

  • Создайте логическое значение, которое проверяет состояние Game Over.
  • Создайте дескриптор скрипта UIManager

Сделав это, ваша переменная часть скрипта может выглядеть так:

Создание фактической логики
Начните как всегда.

  • Создайте дескриптор UIManager
  • Null-Проверьте дескриптор!

Теперь пришло время перезапустить логику!
Если игрок нажал клавишу R и находится в состоянии окончания игры, перезагрузите сцену

Разбивая это на маленькие кусочки, мы получаем следующие вещи, которые нам нужно проверить:

  • Проверьте наличие логического состояния Game Over.
  • Проверьте, не нажата ли клавиша R на клавиатуре.
    Помните, что нажатие клавиши может произойти в любой момент!
  • Если оба применимы, перезагрузите сцену.

Мы проверяем два условия, которые должны быть выполнены. В противном случае мы не хотим проверять ввод на клавишу R. Идеальное использование для оператора if!

Если вы хотите возиться со сценами, в Unity есть встроенный метод SceneManagement. Чтобы использовать этот метод, вам необходимо интегрировать библиотеку UnityEngine.SceneManagement в самый верх вашего скрипта.

Изменение логического значения в нужное время
Наконец, нам нужен последний маленький метод, который позволит игроку фактически перезапустить игру. Поскольку мы хотим вызывать его из сценария UIManager.cs, нам нужно сделать этот метод общедоступным.

Цель проста. Установите логическое значение true.

Это все, что нам нужно!

Небольшие последние детали, чтобы заставить его работать как задумано
Мы хотим вызвать метод, как только у игрока не останется жизней. Проверка оставшихся жизней находится внутри скрипта UIManager.cs.

  • Откройте скрипт UIManager
  • Найдите метод UpdateLives([…])
  • Внутри оператора switch щелкните внутри case 0.
  • Вызовите только что созданный метод GameOver() в GameManager.

Возможно, вы заметили, что получите сообщение об ошибке.

Это нормально. Давайте посмотрим, почему мы получаем эту ошибку.

  • Метод, к которому мы пытаемся получить доступ, находится внутри сценария GameManager.
  • Мы хотим вызвать метод из UIManager.
  • Однако скрипт UIManager не знает, что у нас есть скрипт GameManager.
  • У нас нет дескриптора для него, и поэтому мы не можем получить доступ к методам внутри скрипта.

К счастью, эта проблема легко решается. Нам просто нужно создать дескриптор сценария GameManager обычным способом. Variable › Handle › NullCheck

Это работает!
Теперь все настроено и должно работать как надо!

Давайте посмотрим на конечный результат: