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() будем просто вызывать его. Выглядеть это будет так:
Вы можете протестировать, что получается, а также настроить переменную длительности затухания FadeDuration, как Вам нравится.
Что получается при окончании игры можно увидеть на видео:
Часть 10 https://dzen.ru/a/Y8BLpxuB_AmQzxx0