Найти тему

Unity 3D. John Lemon's Jount. Part 9

Part 8 https://dzen.ru/a/Y8DaW6hpsB8Ditkv

Когда Джон Лимон выходит из дома незамеченным, необходимо завершить игру. Это означает, что нужно изменить значение свойства Alpha группы Canvas с 0 до 1. Но компьютеру нужен способ распознать, что Джон Лимон вышел из дома с привидениями. Для обнаружения того, что физический объект вошел или вышел из определенной область, заключается в использовании коллайдеров типа Trigger. Триггеры — это коллайдеры, которые не препятствуют движению — вместо этого они позволяют физическим объектам свободно проходить через них, но сообщают о событии срабатывания, чтобы могли произойти другие действия.

Сначала создадим триггер. В окне иерархии объектов щелкните на кнопку "+" и выберите «Create Empty».

Создание пустого объекта
Создание пустого объекта

Переименуйте созданный объект в GameEnding. Задайте свойство Position компонента Transform (18, 1, 1.5 ). Добавьте компонент Box Collider и поставьте у него галочку в свойстве Trigger.

Теперь нужно изменить размер триггера так, чтобы он закрывал выход — Джон Лимон должен будет войти в него, чтобы сбежать. Это можно сделать двумя способами:

  • задать свойство Size у коллайдера на (1 ,1 ,3.5 )
  • нажать кнопку «Edit Collider» и изменить размер Box Collider вручную, перетаскивая мышкой зеленые квадратики, появившиеся на форме коллайдера.

Сделайте как Вам удобнее. В итоге объект должен выглядеть следующим образом:

Настройка триггера выхода из игры
Настройка триггера выхода из игры

Добавьте объекту GameEnding скрипт, назовите его аналогично GameEnding и перенесите этот скрипт в папку Scripts:

Добавление скрипта
Добавление скрипта

Откройте скрипт и создайте заготовку метода OnTriggerEnter(). Это стандартный метод Unity, который вызывается, когда в этот коллайдер попадает какой-то другой коллайдер, например, нашего кота.

Нам понадобится переменные. Во-первых, необходимо, чтобы экран затухал в течение определенного периода времени. Для этого нам понадобится две переменные. Одна переменная будет хранить значение времени затухания. Кому-то захочется сделать затухание за 1 секнду, кому-то больше понравится затухание за 2 секунды. Это будет общедоступная переменная , чтобы Вы могли настроить ее из Unity по своему желанию. Значение по умолчанию зададим 1 секунду.

public float FadeDuration = 1f;

Вторая необходимая переменная - это таймер, который будет отсчитывать это время, чтобы остановить его, когда время затухания истечет. Эта переменная будет работать только в скрипте, поэтому делать общедоступной ее не нужно.

float timer;

Далее, затухание должно происходить, когда именно персонаж игрока попадает в триггер. Поэтому нам понадобится ссылка на игровой объект персонажа. Опять же, это должна быть общедоступная переменная, чтобы вы смогли связать ее с персонажем в Unity.

public GameObject Player;

Следующая переменная, которая нам понадобится, для хранения группы UI элементов, чтобы изменять у нее прозрачность. Это общедоступная переменная, чтобы можно было связать ее с группой изображений в Unity.

public CanvasGroup exitImageCanvasGroup;

Переходим к коду метода OnTriggerEnter(). Чтобы убедиться, что окончание игры наступает только тогда, когда Джон Лимон попадает в Box Collider, добавим проверку этого условия:

if (other.gameObject == Player) {

}

Мы проверили равен ли объект столкновения объекту игрока и теперь должны запустить затухание экрана. Но затухание экрана мы можем реализовать только в методе Update(), поскольку он запускается каждый кадр, а метод OnTriggerEnter() запускается всего один раз в момент соприкосновения коллайдеров. Чтобы передать в метод Update() сигнал о том, что можно запустить затухание, нам понадобится еще одна переменная, но уже не общедоступная, поскольку ее настраивать не нужно. Определим глобальную переменную и зададим ей значение равным false, потому что при запуске игры персонаж у нас точно не вышел:

bool isPlayerExit = false;

При соприкосновении Box Collider и коллайдера кота эта переменная должна стать равной true, поскольку это и есть событие выхода из дома:

if (other.gameObject == Player) {
isPlayerExit = true; }

Теперь в методе Update() мы можем запустить затухание по условию, что кот вошел в триггер выхода из игры и переменная isPlayerExit стала равна true.

if (isPlayerExit)

{

timer = timer + Time.deltaTime;

exitImageCanvasGroup.alpha = timer / FadeDuration;

if (timer > FadeDuration)

{

Application.Quit();

}

}

Что происходит в этом коде... По условию, что персонаж дошел до выхода мы увеличиваем таймер на величину времени, прошедшую с предыдущего кадра. А затем задаем прозрачность группе изображений. Пока значение таймера маленькое, то и значение альфа тоже небольшое. Чем больше становится значение таймера, тем наши изображения становятся более четкими, а изображение сцены соответственно затухает. Когда значение таймера станет равно FadeDuration, значение прозрачности станет равно 1 и изображение сцены совсем исчезнет под группой UI-изображений. Ну и в следующем кадре значение таймера станет больше, чем FadeDuration и на этом приложение закрывается при помощи команды Application.Quit(). Сразу отмечу, что выход из приложения в среде Unity Вы не увидите, поскольку он там не работает. Поэтому такой выход мы сможем протестировать, когда сбилдим игру и запустим ее вне среды Unity. Но чуть позже... Пока мы увидим только затухание игры и картинку с выигрышем.

Скрипт выглядит теперь так:

Скрипт
Скрипт
Скрипт
Скрипт

Теперь необходимо задать общедоступные переменные, которые мы создали в скрипте. По умолчанию их значение None, что значит ничего. И при запуске игры мы увидим ошибки в консоли, которые сообщают о том, что переменные не могут быть пустыми.

Переменную Player свяжем с объектом персонажа из окна иерархии, а переменную ImageCanvasGroup с родительским объектом UI-изображений:

Привязка переменных
Привязка переменных

И последнее замечание - по правилам хорошего кода в методе Update() лучше не оставлять много кода, поскольку в нем потом становится сложно ориентироваться. Код лучше структурировать и разбивать на отдельные методы. Поэтому давайте выделим код изменения прозрачности UI-изображений в отдельный метод, который назовем EndLevel(), а в методе Update() будем просто вызывать его. Выглядеть это будет так:

Метод EndLevel()
Метод EndLevel()

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

Что получается при окончании игры можно увидеть на видео:

Часть 10 https://dzen.ru/a/Y8BLpxuB_AmQzxx0