27 ноября 2016 г. в 23:43
by CoMiGo Games

Как сделать поддержку для геймпада в Unreal Engine? Как сделать поддержку для геймпада в Unreal Engine?

Часть первая, про управление персонажами.
Долгое время для поддержки геймпадов люди, писавшие на Unreal Engine, лепили гору костылей, а их код превращался в ворох макарон, в котором легко было потеряться. Куда уж там говорить про постепенное наращивание функционала — любые модификации требовали бы кучу переделок.
Сейчас дела не так плохи — в Unreal Engine 4.13.x есть полуавтоматическая поддержка геймпада в игре как таковой и в UMG. Полуавтоматическая она потому, что её нужно самостоятельно настраивать, но базовый набор функций уже за вас сделан.
Дискляймер: это оригинальное исследование. Не удивляйтесь, что для стрельбы здесь используются плечики, а не триггеры, хотя даже по названию должно быть наоборот. Моим пальчикам так удобнее с:
Также, при любой перепечатке, копировании и всём таком ссылка на эту статью обязательна. Уважайте чужой труд.
По факту, процесс полной адаптации игры под геймпады делится на две части:
  1. добавление геймпада как одного из методов ввода и вплетение его в игру;
  2. адаптация и связка элементов управления меню для геймпадов.
То-есть после адаптации любой игрок сможет делать в игре всё то, что он делал с мышью и клавиатурой — от запуска игры и убийства мобов до поедания пирожков и использования того ключа на пятом сундуке.
Самым страшным кажется, конечно, второй пункт — первый хорошо решается уже в стандартных шаблонах анрила (First Person Shooter, например), а вот с менюхами нигде ничего не сказано. Лично я из-за этого ожидал, что «вхождение» в поддержку будет более болезненным, однако мой метод магического тыка™ быстро понял, что к чему.
Тем не менее, статья получилась бы очень огромной, и поэтому разбита на две части. Здесь мы рассмотрим управление героем.
Итак, поехали!

Настраиваем управление для геймпада

Начнём с основы — с движения игроком.
Начало нашей настройки ведёт в редактор — Edit — Project settings — подзаголовок Engine — Input. Здесь мы добавим контролы геймпада в имеющиеся события, если вы это ещё не сделали. Так, например, я подвязал Ди-пад своего Nakatomi к уже имеющимся кнопкам WASD и стрелкам:

Контроллеры бывают разные, люди — тем более. Кому-то удобно играть на Ди-паде, а кому-то — на стиках. Это схоже с холиваром любителей WASD и стрелок. Чтобы не быть негодяем, нужно добавить и стики. Делается это в том же окне в следующей категории:

Это мой вид настроек. А шаблон First Person Shooter наоборот превращает все кнопки клавиатуры и мышь в движение осей (Axis Mappings):
Обратите внимание, что для тех клавиш, которые ведут в обратное направление, указан Scale = -1.0
Этот метод лучше, потому как за счёт преобразования всех нажатий клавиш в оси у вас вдвое-втрое сокращается количество событий в блупринтах. Но в реальной жизни конечный вид инпутов зависит от двух факторов:
  • вашей игры как таковой — её игровых механик и жанра;
  • того, что уже было написано до того, как вы решили сделать поддержку геймпада :)

Добавляем движение

Bitmaster зародился ещё на версии анрила 4.7 и унаследовал все костыли былого шаблона Twin Stick Shooter. В игре курсор показывает, куда стрелять, а с клавиатуры и указываем направление движения. На геймпаде и тем, и другим будут управлять стики, плюс Ди-пад как альтернативный способ движения.
Напрямую узнать через блупринты, подключен ли сейчас к компьютеру геймпад, невозможно. А если бы и были возможно, то было бы непонятно, что же со всем этим делать — вдруг игрок резко захочет пересесть обратно на мышь (или вообще не знает, что у него геймпад подключен). Зато мы можем в любой момент времени узнать состояние джойстиков через Get <название_инпута>. Если стики находятся в состоянии покоя, то переключаемся на управление мышью, а если нет — то на геймпад:
Сравниваем состояние каждого стика с нулём. В случае стиков, ноль — это состояние покоя
Далее остаётся только преобразовать это состояние в нужное направление. Например, вот так:
Здесь мы присваиваем угол поворота героя на основе состояния стиков
Аналогично в Битмастере задаётся вектор ускорения:
Этот граф выполняется каждый кадр в событии Tick
Если вы используете класс персонажа Character (например, когда игра основана на шаблоне для FPS или вида от третьего лица), количество кода сводится до минимума — нужно просто передать инпуты контроллера этому классу:

Этот код красив и лаконичен и предназначен для вращения камеры персонажа. Он взят без изменений из First Person Template — схожий график перемещения вы найдёте там же, в блупринте FirstPersonCharacter.

Другие действия

Есть игры без особых контролов, а есть те, где их много. В том же Bitmaster помимо стрельбы нужно менять пушки, а при появлении определённых перков появляются новые возможности — телепорт, бомы, смена шейдера :D Настраиваются они легко, но нужно помнить про ряд вещей:
  • контролы должны быть удобны. Стрельбу лично я накладываю на кнопки-плечики, потому что стрелять приходится много, а так будет удобно указательными пальцами атаковать — большие пальцы окажутся свободны для перемещения и прицеливания;
  • совершенно разные действия должны соответствовать совершенно разным кнопкам. Кнопки смены оружия — это триггеры под кнопками-плечиками. Перкам выделены все кнопки действий;
  • контролы должны быть интуитивно понятны. Здесь, конечно, сложнее — особенно, если в игру будет играть новичок, поэтому…
  • …поэтому лучше делать небольшие подсказки по вызову определённых функций. Там, где это будет уместно, лучше сделать интерактивные туториалы.
Использование кнопок-действий ничем не отличается от обычных клавиш на клавиатуре. Так они описываются в настройках наряду с кнопками клавиатуры:

Так они могут использоваться. Ничего нового:

Грабли — нестандартное управление

На практике иногда приходится переосмыслить управление некоторых вещей.
В Битмастере есть замечательный герой Вик — он быстр, хитёр, у него самый мощный щит наряду с самой медленной скоростью его восстановления. И у него есть волшебная пушка, которая позволяет атаковать мобов по дуге, что позволяет сначала расправиться с опасными мобами, а потом уже с остальными. А ещё эта пушка позволяет быстро расправиться с Цитаделью, только тс-с-с!
Так вот, когда у вас есть мышь и клавиатура, точка приземления снарядов находится под курсором, и это хорошо. Но ведь на геймпаде нет курсора! Надо думать.
Всего было три варианта управления пушкой Вика:
  1. на экране есть некая метка, расположение которой управляется по аналогии с перемещением персонажа (похожее есть в игре Zombie Vikings у девочки-ворона);
  2. направление стрельбы управляется так же, как и у других пушек, а радиус стрельбы указывается длительностью зажатия кнопки выстрела перед самой стрельбой;
  3. дальность стрельбы контроллируется углом стика.
Ввиду того, что от игрока Битмастера почти всё время требуются быстрые действия, был выбран последний вариант. В качестве замены курсора на земле рисуется большой белый крест, куда будут падать снаряды.
В этом решении всё равно есть огромная проблема — точность. Если вы геймпадовый новичок и вы выбрали Вика, то на первых волнах вам будет очень тяжело… Помимо точности, у геймпада может быть ограничена чувствительность стиков. У меня дома, например, лежит пара геймпадов времён PlayStation 2 без чувствительности как таковой — т.е. оси выдают значения -1, 0 и 1, но не промежуточные. Как на них целиться? Никак — срочно хватать другую пушку и отстреливать всех. Но это не то, чего хотим мы и игроки.
Даже не смотря на то, что со временем можно приноровиться так расстреливать врагов, я считаю такое решение очень и очень паршивым. Если у вас есть мысли, как улучшить это поведение, напишите в комментариях — буду очень признателен :)

Отправить комментарий

Комментариев нет. Будете первым!

Подписка на обновления

Хорошим грех не делиться

Поиск по блогу

Последние записи в блоге

Возможно, вам понравится