Unreal Engine 5 / Blueprints Guide
Blueprint Only UE5
🎮

Нажатие ESC в режиме Game Only UI

Задача: при открытом виджете — заблокировать управление персонажем, но оставить возможность закрыть UI по нажатию Escape.

Widget Blueprint Player Controller BP OnKeyDown Override Input Mode
⚠️

Почему это не работает «из коробки»?

В режиме Game Only весь ввод идёт в персонажа/контроллер, а виджеты его не получают. В режиме UI Only — наоборот, персонаж заблокирован, но Enhanced Input в Player Controller не срабатывает. Нужен правильный подход через Override OnKeyDown в самом виджете.

Выберите подход

Рекомендуемый метод. Переопределяем функцию OnKeyDown прямо внутри Widget Blueprint. Устанавливаем режим UI Only — персонаж полностью заблокирован. ESC перехватывается виджетом.

1

Настройка Widget Blueprint — включить Is Focusable

В самом виджете, без этого OnKeyDown работать не будет

Где найти:

  1. 1. Открой Widget Blueprint
  2. 2. В панели Hierarchy кликни на самый верхний элемент (корневой — обычно называется [YourWidgetName])
  3. 3. В панели Details найди секцию Interaction
  4. 4. Поставь галочку ✅ Is Focusable

💡 Важно

Is Focusable должен быть включён у корневого виджета (User Widget), а не у отдельной кнопки. Это позволяет виджету принимать клавиатурный фокус.

2

Override функции OnKeyDown в виджете

Перехватываем нажатие клавиши прямо в Widget Blueprint

  1. 1. В Widget Blueprint перейди во вкладку Graph
  2. 2. В панели слева найди Functions → Override
  3. 3. В выпадающем списке выбери On Key Down
  4. 4. Автоматически создастся функция с нодой Event On Key Down

⚠️ Не перепутай

Это именно Override (переопределение), а не создание новой функции через «+». Только Override даёт доступ к системным событиям UMG.

3

Blueprint граф функции On Key Down

Собери эти ноды в Graph редакторе

Event On Key Down
In Key Event (struct)
Get Key
from In Key Event
== (Equal Key)
Key: Escape
Branch
True / False

Ветка TRUE (нажат ESC)

True pin
Remove from Parent
Target: Self
Set Input Mode Game Only
Target: Get Player Controller
Set Show Mouse Cursor
False
Return Node
Return Value: Handled ✓

Ветка FALSE (другая клавиша)

False pin
Return Node
Return Value: Unhandled ✗

💡 Зачем Unhandled?

Unhandled означает «виджет не обработал эту клавишу». В режиме UI Only она всё равно никуда дальше не пройдёт — персонаж не получит ввод. Это просто корректное завершение функции.

🔑 Return Value — что выбрать?

Handled — виджет обработал клавишу. Событие останавливается, дальше по цепочке не идёт. Используй для ESC.
Unhandled — виджет не обработал клавишу. Событие идёт дальше. В UI Only всё равно заблокируется.
4

Blueprint открытия виджета — Player Controller или Level BP

Когда показываешь виджет — устанавливаешь правильный Input Mode

Event (например,
клавиша I / Tab)
Create Widget
Class: твой виджет
Add to Viewport
Set Input Mode UI Only
In Widget to Focus:
твой виджет
Set Show Mouse
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.

1

Создать Input Action для ESC (Enhanced Input)

  1. 1. В Content Browser: ПКМ → Input → Input Action → назови IA_CloseUI
  2. 2. Value Type: Digital (bool)
  3. 3. В Input Mapping Context добавь это действие, привяжи к клавише Escape
  4. 4. Важно: в IMC убери галочку Consume Input если нужен сквозной проброс
2

В Player Controller Blueprint — обработка IA_CloseUI

Enhanced Input Action
IA_CloseUI (Triggered)
Branch
Is Widget Open?
Call Function
CloseUI на виджете
Set Input Mode
Game Only

Проблема режима Game and UI: персонаж частично получает ввод. Нужно вручную отключить движение через Set Input Mode UI Only или Disable Input на Pawn.

3

Блокировка движения персонажа при открытом UI

Вариант А — через Input Mode

Set Input Mode UI Only
↓ (персонаж полностью заблокирован)

Вариант Б — Disable Input

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 ноды

Set Input Mode UI Only
персонаж полностью заблокирован
Set Input Mode Game Only
вернуть управление персонажу
Set Input Mode Game and UI
оба режима параллельно

Полезные ноды для виджета

Get Owning Player
Player Controller прямо из виджета
Remove from Parent
закрыть и удалить виджет
Set Keyboard Focus
принудительно сфокусировать элемент

Итоговый алгоритм — что делать шаг за шагом

1

Widget BP → Hierarchy → корневой элемент → Details → Is Focusable = TRUE

2

Widget BP → Graph → Functions → Override → On Key Down

3

Собери граф: Get Key → == Escape → Branch[True] Remove + GameOnly + Return Handled | [False] Return Unhandled

4

В коде открытия виджета: Create → Add to Viewport → Set Input Mode UI Only (передать виджет) → Show Mouse Cursor = True

5

В Editor Preferences отключить ESC exit PIE для тестирования

Unreal Engine 5 · Blueprint Only · Widget Input Guide