Всем привет! Решил сделать в 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 если символов введено больше трех. Это не обязательно.При изменении текста в поле ввода, проводится проверка на количество символовНа этом все. Пишите в комментариях как на ваш взгляд можно улучшить этот виджет, так же буду рад ссылкам на подобные решения.Хеш-теги для индексации: #ue4 #gamedev #unrealengine #unrealengine4 #blueprints #gamepad #input #gamepadinput #screenkeyboard #keyboard #key #tutorial #indiedev
Страшна. Можно ведь сделать кнопку отдельным виджетом, внутри которого будет идти обработка.
очень муторно... спасиб за разбор!
Да, можно и так. Но все рано, придется либо для каждой буквы отдельный актор делать, либо такую же таблицу где значения будут подаваться внутрь кнопки.
В виджете кнопки сделать instance editable variable, и в виджете клавиатуры просто в параметрах кнопки выставить соответствующую ей букву.
Если вы увидели ошибку в этой статье пишите под этим комментом, я постараюсь поскорее все исправить