{"id":4012,"url":"\/distributions\/4012\/click?bit=1&hash=5b9cad3f989520ad358a2237d28d1f12ecdc50cb8452456f27fcbce716b2c8f0","title":"\u041f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0441\u0442\u0435\u0441\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0438\u0435\u043b\u0442\u043e\u0440\u043e\u0432","buttonText":"","imageUuid":"","isPaidAndBannersEnabled":false}

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

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

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

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

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

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

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

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

Поле ввода - TextBox

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

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

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

Названия кнопок можно подсмотреть в настройках проекта > Input

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример:

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

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

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

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

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

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

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

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

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

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

0
8 комментариев
Написать комментарий...
Антон Антонов

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

Ответить
Развернуть ветку
Михаил Ефремов

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

Ответить
Развернуть ветку
Nikolay
Автор

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

Ответить
Развернуть ветку
Антон Антонов

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

Ответить
Развернуть ветку
Nikolay
Автор

Спасибо! Не подумал об этом, так действительно лучше.

Ответить
Развернуть ветку
Антон Антонов

Удачи с проектом.

Ответить
Развернуть ветку
Nikolay
Автор

Спасибо!

Ответить
Развернуть ветку
Nikolay
Автор

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

Ответить
Развернуть ветку
Читать все 8 комментариев
null