Ввод игрока: Enhanced Input

Урок про современную систему обработки ввода Unreal — Enhanced Input.

Enhanced Input — это система ввода Unreal, где абстрактные действия (Input Action) отделены от конкретных клавиш, которые задаются в контексте (Input Mapping Context).

Зачем отделять действие от клавиши

Раньше ввод привязывали жёстко: «клавиша Space → прыжок». Это неудобно: трудно переназначить управление, поддержать геймпад и менять схему по ситуации. Enhanced Input вводит слой абстракции. Вы создаёте Input Action — например, «Прыжок» — как самостоятельную сущность. Какая именно клавиша его вызывает, описывается отдельно в Input Mapping Context. Это позволяет легко менять раскладку и иметь разные схемы (в меню одна, в игре другая).

Три ключевые сущности

СущностьРоль
Input Action (IA)Абстрактное действие: Прыжок, Движение, Огонь
Input Mapping Context (IMC)Карта: какая клавиша/стик запускает какое действие
Modifier / TriggerОбработка ввода: инверсия оси, мёртвая зона, удержание

Поток обработки ввода

Игрок нажал клавишу
     |
[Input Mapping Context]  -- сопоставляет клавишу с действием
     |
[Input Action: Jump]     -- абстрактное действие сработало
     |
[Обработчик в Blueprint/C++]  -- персонаж прыгает

Типы значений действия

Action может выдавать разные данные. Для прыжка достаточно булева (нажато/нет). Для движения нужна ось или вектор: например, Axis2D даёт пару значений X и Y от стика или клавиш WASD. Modifier'ы по пути могут инвертировать ось или применить мёртвую зону геймпада.

Как это подключают

Чтобы контекст заработал, его добавляют игроку при старте — обычно в BeginPlay персонажа через подсистему ввода. После этого действия из этого контекста начинают приходить. В Blueprint каждое действие даёт событие (Triggered, Started, Completed), к которому привязывают логику.

Как работает под капотом

Когда приходит аппаратный ввод, подсистема Enhanced Input смотрит активные Mapping Context (их может быть несколько, с приоритетами), находит сопоставленные действия, прогоняет значение через модификаторы и триггеры, а затем рассылает события привязанным обработчикам. Приоритеты контекстов решают конфликты: контекст меню может «перебить» игровой.

Частые ошибки

  • Забыть добавить Mapping Context. Без активного контекста действия не приходят — ввод «мёртв».
  • Путать Started и Triggered. Started срабатывает в момент нажатия, Triggered — пока условие триггера выполняется.
  • Жёстко завязываться на клавишу. Вся идея системы — работать через абстрактные действия.

Несколько контекстов и приоритеты

Сила Enhanced Input раскрывается, когда контекстов несколько. Представьте: в обычной игре активен контекст движения и стрельбы. Игрок открывает меню — вы добавляете контекст меню с высоким приоритетом, и его действия (навигация, выбор) перехватывают ввод, а игровой контекст временно «глохнет». Закрыли меню — убрали контекст, игровое управление вернулось. Так одни и те же клавиши осмысленно работают по-разному в разных ситуациях, без громоздких проверок «а мы сейчас в меню?».

Похоже устроены и контекстные действия: сел в машину — добавился контекст вождения с педалями и рулём; вышел — убрался. Контексты как слои, накладываемые и снимаемые по ходу игры, с приоритетами, разрешающими конфликты. Это куда чище старого подхода, где всё управление жило в одном месте и обрастало флагами состояний.

Итоги

  • Enhanced Input отделяет действия (IA) от клавиш (IMC).
  • Modifier'ы и Trigger'ы обрабатывают ввод: инверсия, мёртвая зона, удержание.
  • Контекст добавляют игроку при старте; контексты имеют приоритеты.
  • Каждое действие даёт события Started, Triggered, Completed.
Проверьте себя
1. Что описывает Input Mapping Context?
AАбстрактное действие
BКакая клавиша или стик запускает какое действие
CСкорость персонажа
DОсвещение сцены
2. В чём главное преимущество отделения действия от клавиши?
AИгра весит меньше
BЛегко переназначать управление и поддерживать разные устройства
CБыстрее рендеринг
DНе нужен GameMode
3. Что произойдёт, если не добавить Mapping Context игроку?
AВвод работает как обычно
BДействия не приходят — ввод не реагирует
CИгра не запустится
DПерсонаж удвоит скорость