GameDev 3.0. Этап 2.1. Дальний бой. Урок 6. Взаимодействие с кнопкой
- Создание блюпринта для двери, механика их открытия, подключение в основную механику
- Анимация камеры при нажатии на кнопку
- Вычисление задержки перед началом активации кнопки
Создание блюпринта для двери, механика их открытия, подключение в основную механику
Теперь сделаем так, чтобы двери открывались при нажатии на кнопку.
Переходим в папку Content -> Systems -> Interaction -> BP, создаем новый блюпринт класс: ПКМ -> Blueprint Class -> Actor, назовем BP_Door.
Заходим в него и создаем не статик мэш, как создавали кнопке, а Skeletal Mesh, т.к. он отвечает за анимацию. Назовем его Door
Теперь подкинем сюда дверь, найдем Skeletal Mesh:
выделяем его, идем в блюпринт, выделяем Door и справа в Details нажимаем на кружок со стрелкой.
Дверь очень большая, но если мы зайдем в Animation Mode в Details, включим Use Animation Asset:
Далее выберем Anim to Play и выберем анимацию проигрывания
Дверь станет нормального размера. Выключим Looping и Playing, чтобы анимация не проигрывалась вообще:
Теперь ту дверь, что ставили ранее, заменим блюпринтом.
Добавим двери коллизию, возвращаемся в BP_Door, заходим в Collision Presets, ставим Block All
После этого ставим Custom и коллизия пока что включена:
Теперь переходим в Event Graph блюпринта двери. Будем создавать ивент, который будем вызывать, чтобы дверь открылась и мы могли пройти сквозь него. Ивент будем вызывать из кнопки.
Для начала сделаем это на Event Begin Play. Вытягиваем Door, из нее Play, Play соединим с Event Begin Play. Вызываем ноду Set Collision Enabled, для отключения коллизии:
При запуске игры дверь теперь открывается сразу, значит все правильно. Идем дальше.
Теперь отключаем связь с Event Begin Play, создадим свой ивент - ПКМ -> Т., назовем OpenDoor.
Теперь, когда вызовем этот ивент, откроется дверь и отключится коллизия.
Переходим в блюпринт кнопки, создаем переменную DoorRef типа BP_Door -> Object Reference:
Но как указать, что именно эта дверь? Нажимаем в переменных глазик у этой переменной:
Теперь эта переменная публичная:
Выбрав пипетку, укажем какая именно это дверь
Теперь пропишем открытие двери, напишем после проигрывания анимации AnimMontage, вызываем Delay, Duration соединим с Return Value, это означает, что задержка длится ровно столько, сколько проигрывается анимация нажатия на кнопку.
Вызовем с зажатым Ctrl переменную DorRef, из него вызовем ивент Open Door. Его соединим с Delay:
Сейчас хочется, чтобы камера поворачивалась к двери и убрать баг застывания возле кнопки.
Вернем движение после нажатия на кнопку. Находим функцию оверлапа и скопируем 2 ноды: Enable Input и Get Player Controller.
Вставим их после Move to Location. Target это CharRef, подключаем Enable Input с Move to Location.Добавим между ними Delay, чтобы управление не сразу пришло, секунд на 2:
К тому же, нам нужно убрать функцию Stop?, которую мы чуть раньше включали. Из CharRef вызываем Set Stop?, его соединим с Enable Input
И еще надо сделать так, чтобы блюпринт кнопки забывал нашего персонажа. Для этого вызываем CharRef с зажатым Alt и подключаем его с SetStop?
Теперь нам надо повторить 3 функции (ноды) эти:
Скопируем их и вставляем после Set:
И удалим сферу после открытия с помощью Destroy, вытащим Sphere, сферу соединим с Destroy.
Анимация камеры при нажатии на кнопку
Давайте добавим механику, чтобы поворачивалась камера.
Заходим в BP_Button во Viewport и добавим камеру: +Add -> Camera
Установим камеру примерно таким образом, чтобы она смотрела на кнопку:
Мы сделаем такой вид из камеры при открытии двери
Выделим кнопку и настроим камеру, для этого выделим камеру в Details и меняем положение так, как нам нужно.
После установки меняем Fields of View:
Теперь в BP_Button делаем так, чтобы при нажатии на кнопку вид из камеры сменился на эту.
Отодвинем Delay от Move to Location и туда пропишем новую логику:
Скопируем Get Player Controller, оттуда вызовем Set View Target with Blend:
Blend Time пока поставим 0.8, Blend Exp - 1.7, Blend Func - Cubic, Lock Outgoing ставим галочку, в New View Target вызываем Self:
Создадим и для двери кастомную камеру
И теперь добавим еще один Set View Target with Blend для нашего персонажа, то есть вернем камеру в исходное положение. Прокопируем ноды, ставим такие значения:
Получится вот так (изменим значение второго Delay на 2):
Изменим немного выше задержки:
Все работает, если надо, то исправить камеры.
Вычисление задержки перед началом активации кнопки
Теперь добавим последнюю фишку для нашей механики, это, чтобы наша задержка, перед тем как мы нажмем на кнопку, зависела от того, насколько далеко мы от кнопки, сколько нам к ней бежать, например, если мы рядом с кнопкой, анимация проигрывалась сразу, чтобы перс не стоял и не тупил.
Находим верхний Delay перед AnimMontage по линии Then 0. Чуть-чуть отодвинем, скопируем снизу Get Actor Location'ы, добавим Distance (Vector):