Unreal Engine 4 экранная клавиатура для геймпада (Blueprints)

Всем привет! Решил сделать в UE4 ввод с экранной клавиатуры для USB геймпада подключенного к PC.

Весь функционал располагается в двух виджетах: один содержит поле ввода, другой саму логику клавиатуры.

Настоятельно рекомендую к ознакомлению серию уроков по созданию виджетов управляемых геймпадом

Вызов экранной клавиатуры

Для удобного вызова виджета клавиатуры я сделал функцию ScreenKeyboardOn в Game Instance.

Создает и добавляет на экран виджет экранной клавиатуры<br />
Создает и добавляет на экран виджет экранной клавиатуры

Эта функция вызывается в виджете, который содержит поле ввода текста.

Поле ввода - <i>TextBox</i><br />
Поле ввода - TextBox

Для того, чтобы виджет реагировал на нажатие кнопки геймпада необходимо переопределить (Override) функцию OnKeyDown в самом виджете.

При наведении на + слева появится кнопка Ovveride <br />
При наведении на + слева появится кнопка Ovveride

В функции OnKeyDown добавляю значения для нажатия кнопок геймпада, после этого на нужную мне кнопку назначаю функцию ScreenKeyboardOn из Game Instance проекта.

Названия кнопок можно подсмотреть в настройках проекта &gt; <b>Input</b>
Названия кнопок можно подсмотреть в настройках проекта > Input

Виджет клавиатуры

Unreal Engine 4 экранная клавиатура для геймпада (Blueprints)

Виджеты в которых предполагаются действия геймпадом необходимо сделать фокусируемым.

<i>Is Focusable</i> ставить галочку для корневого элемента виджета, в каждом виджете отдельно<br />
Is Focusable ставить галочку для корневого элемента виджета, в каждом виджете отдельно

Так как я не программист, то логику делал на Blueprints

Unreal Engine 4 экранная клавиатура для геймпада (Blueprints)

Для начала необходимо установить шрифты и определить кнопки задействованные в виджете, так же из родительского виджета берется название

<i>ParentWidgetRef</i> - переменная хранящая информацию о виджете который вызывает клавиатуру<br />
ParentWidgetRef - переменная хранящая информацию о виджете который вызывает клавиатуру

Шрифт я устанавливаю для всех виджетов в игре, но это не обязательно.

В <b>Game Instance</b> хранится переменная, содержащая информацию о шрифте
В Game Instance хранится переменная, содержащая информацию о шрифте

Кнопки виджета я сохраняю в массив, в этой же функции устанавливаю фокус на определенную кнопку.

Unreal Engine 4 экранная клавиатура для геймпада (Blueprints)

Цикл вызывающий функцию Start из кастомных кнопок позволяет геймпаду менять стиль кнопки.

Одновременно с этим устанавливаем название клавиатуры из родительского виджета

Unreal Engine 4 экранная клавиатура для геймпада (Blueprints)

Кнопки действий

Действия кнопок собраны в отдельные функции для удобства обращения из <i>OnKeyDown</i><br />
Действия кнопок собраны в отдельные функции для удобства обращения из OnKeyDown

На случай случайного нажатия мыши вне клавиатуры вызывается функция закрытия CloseKeyboardWidget

Убирает с экрана виджет клавиатуры и устанавливает фокус на кнопке родительского виджета.<br />
Убирает с экрана виджет клавиатуры и устанавливает фокус на кнопке родительского виджета.

Удаление последнего символа

Unreal Engine 4 экранная клавиатура для геймпада (Blueprints)

Заглавные буквы

Unreal Engine 4 экранная клавиатура для геймпада (Blueprints)

Ввод записанного значения в текстовое поле, из которого был вызван виджет клавиатуры

Unreal Engine 4 экранная клавиатура для геймпада (Blueprints)

Кнопки клавиатуры

Для каждой буквы придется указывать два значения - строчной и заглавной<br />
Для каждой буквы придется указывать два значения - строчной и заглавной
Unreal Engine 4 экранная клавиатура для геймпада (Blueprints)

Записываем буквы и выводим результат на экран

В переменную <b>InText</b> добавляем себя+значение кнопки, записываем в <b>Text</b> выводящий текст в виджете клавиатуры<br />
В переменную InText добавляем себя+значение кнопки, записываем в Text выводящий текст в виджете клавиатуры

Пример:

Кнопки геймпада

В виджете который будет вызывать клавиатуру необходимо назначить нажатие кнопки геймпада

Unreal Engine 4 экранная клавиатура для геймпада (Blueprints)

В виджете клавиатуры можно назначить удаление и Shift на кнопки геймпада

Нижняя кнопка геймпада по умолчанию используется движком для нажатия<br />
Нижняя кнопка геймпада по умолчанию используется движком для нажатия

Навигация в клавиатуре

На крайних кнопках назначаю противоположные кнопки в панели <b>Navigation</b><br />
На крайних кнопках назначаю противоположные кнопки в панели Navigation

Включение/отключение кнопки

В родительском виджете создаю функцию, которая включит кнопку Save если символов введено больше трех. Это не обязательно.

При изменении текста в поле ввода, проводится проверка на количество символов<br />
При изменении текста в поле ввода, проводится проверка на количество символов

На этом все. Пишите в комментариях как на ваш взгляд можно улучшить этот виджет, так же буду рад ссылкам на подобные решения.

1313
8 комментариев

Страшна. Можно ведь сделать кнопку отдельным виджетом, внутри которого будет идти обработка.

1

очень муторно... спасиб за разбор!

1

Да, можно и так. Но все рано, придется либо для каждой буквы отдельный актор делать, либо такую же таблицу где значения будут подаваться внутрь кнопки.

В виджете кнопки сделать instance editable variable, и в виджете клавиатуры просто в параметрах кнопки выставить соответствующую ей букву.

1

Если вы увидели ошибку в этой статье пишите под этим комментом, я постараюсь поскорее все исправить