Нажатие ESC в режиме Game Only UI
Задача: при открытом виджете — заблокировать управление персонажем, но оставить возможность закрыть UI по нажатию Escape.
Почему это не работает «из коробки»?
В режиме Game Only весь ввод идёт в персонажа/контроллер, а виджеты его не получают. В режиме UI Only — наоборот, персонаж заблокирован, но Enhanced Input в Player Controller не срабатывает. Нужен правильный подход через Override OnKeyDown в самом виджете.
⚡ Выберите подход
Рекомендуемый метод. Переопределяем функцию OnKeyDown прямо внутри Widget Blueprint.
Устанавливаем режим UI Only — персонаж полностью заблокирован. ESC перехватывается виджетом.
Настройка Widget Blueprint — включить Is Focusable
В самом виджете, без этого OnKeyDown работать не будет
Где найти:
- 1. Открой Widget Blueprint
- 2. В панели Hierarchy кликни на самый верхний элемент (корневой — обычно называется
[YourWidgetName]) - 3. В панели Details найди секцию Interaction
- 4. Поставь галочку ✅ Is Focusable
💡 Важно
Is Focusable должен быть включён у корневого виджета (User Widget), а не у отдельной кнопки. Это позволяет виджету принимать клавиатурный фокус.
Override функции OnKeyDown в виджете
Перехватываем нажатие клавиши прямо в Widget Blueprint
- 1. В Widget Blueprint перейди во вкладку Graph
- 2. В панели слева найди Functions → Override
- 3. В выпадающем списке выбери On Key Down
- 4. Автоматически создастся функция с нодой
Event On Key Down
⚠️ Не перепутай
Это именно Override (переопределение), а не создание новой функции через «+». Только Override даёт доступ к системным событиям UMG.
Blueprint граф функции On Key Down
Собери эти ноды в Graph редакторе
In Key Event (struct)
from In Key Event
Key: Escape
True / False
✅ Ветка TRUE (нажат ESC)
Target: Self
Target: Get Player Controller
False
Return Value: Handled ✓
❌ Ветка FALSE (другая клавиша)
Return Value: Unhandled ✗
💡 Зачем Unhandled?
Unhandled означает «виджет не обработал эту клавишу». В режиме UI Only она всё равно никуда дальше не пройдёт — персонаж не получит ввод. Это просто корректное завершение функции.
🔑 Return Value — что выбрать?
Blueprint открытия виджета — Player Controller или Level BP
Когда показываешь виджет — устанавливаешь правильный Input Mode
клавиша I / Tab)
Class: твой виджет
In Widget to Focus:
твой виджет
Cursor: True
✅ Create Widget
Сохрани результат в переменную — он понадобится для In Widget to Focus
🔵 Set Input Mode UI Only
Target: Get Player Controller (index 0)
In Widget to Focus: ссылка на виджет
Mouse Lock Mode: Do Not Lock
⚠️ Порядок важен!
Сначала Add to Viewport, потом Set Input Mode. Иначе фокус не установится.
Альтернативный метод для тех, кто использует Enhanced Input. Обработка ESC идёт через Player Controller, виджет использует режим Game and UI. Подходит если уже настроен Enhanced Input с Input Actions.
Создать Input Action для ESC (Enhanced Input)
- 1. В Content Browser: ПКМ → Input → Input Action → назови
IA_CloseUI - 2. Value Type: Digital (bool)
- 3. В Input Mapping Context добавь это действие, привяжи к клавише Escape
- 4. Важно: в IMC убери галочку Consume Input если нужен сквозной проброс
В Player Controller Blueprint — обработка IA_CloseUI
IA_CloseUI (Triggered)
Is Widget Open?
CloseUI на виджете
Game Only
Проблема режима Game and UI: персонаж частично получает ввод. Нужно вручную отключить движение через
Set Input Mode UI Only или Disable Input на Pawn.
Блокировка движения персонажа при открытом UI
Вариант А — через Input Mode
Вариант Б — Disable Input
Target: GetControlledPawn
| Критерий | Override OnKeyDown | Player Controller |
|---|---|---|
| Сложность | ★★☆ Просто | ★★★ Средне |
| Input Mode | UI Only — персонаж 100% заблокирован | Game and UI — нужно доп. блокировка |
| Enhanced Input | Не нужен | Обязателен |
| Где код | В Widget BP | В Player Controller BP |
| Много клавиш | Через доп. ветки в OnKeyDown | Отдельные Input Actions |
| Рекомендую | ✅ Для ESC-кнопки | Для сложных UI с навигацией |
🐛 Частые ошибки и их решение
❌ OnKeyDown не вызывается вообще ▼
Причины:
- Не включён Is Focusable у корневого виджета
- Не установлен Input Mode → виджет не в фокусе
- Set Input Mode вызван до Add to Viewport
- Не передан виджет в In Widget to Focus
✅ Решение
1. Включи Is Focusable на корневом элементе
2. Порядок: Create Widget → Add to Viewport → Set Input Mode UI Only (с виджетом)
3. Проверь, что передаёшь ссылку на созданный виджет
❌ ESC в PIE (редакторе) закрывает сам редактор, а не UI ▼
Причина:
По умолчанию ESC выходит из PIE-режима в редакторе.
✅ Решение
Edit → Editor Preferences → Play → Allow ESC to close PIE — снять галочку.
Или тестировать в standalone режиме (Launch).
❌ После закрытия виджета персонаж не двигается ▼
Причина:
Забыли вернуть Input Mode обратно в Game Only после закрытия виджета.
✅ Решение
В True-ветке OnKeyDown после Remove from Parent добавь:
Set Input Mode Game Only
Set Show Mouse Cursor → False
❌ Return Node отсутствует или нет варианта Handled ▼
Причина:
OnKeyDown — это функция с возвращаемым значением типа Event Reply.
✅ Решение
Нода Return должна быть в конце. В поле Return Value кликни правой кнопкой →
Split Struct Pin или выбери из выпадающего: Handled / Unhandled.
📋 Быстрая справка по нодам
Input Mode ноды
Полезные ноды для виджета
✅ Итоговый алгоритм — что делать шаг за шагом
Widget BP → Hierarchy → корневой элемент → Details → Is Focusable = TRUE
Widget BP → Graph → Functions → Override → On Key Down
Собери граф: Get Key → == Escape → Branch → [True] Remove + GameOnly + Return Handled | [False] Return Unhandled
В коде открытия виджета: Create → Add to Viewport → Set Input Mode UI Only (передать виджет) → Show Mouse Cursor = True
В Editor Preferences отключить ESC exit PIE для тестирования