Все способы обработать ипут кнопки в модуле Editor
Оверайд InputKey()
virtual bool InputKey(FEditorViewportClient* InViewportClient, FViewport* InViewport, FKey InKey, EInputEvent InEvent) override;Базовая функция, оверайдить которую можно в любом модуле. Кей приходит только если никто другой не Занял кнопку, и фокус Модуль = модулю, где функция заоверайжена.
Что значит Занял кнопку ? Функция возращает боол. Если вернуть Тру - ипут остановится, и никаким другим модулем обрабатываться не будет. Т.е функции Ариала не сработают, например, Еск - не выполнит ничего, если инпут кей вернет тру.
Добавить шорткат
Создание команды
Самый "правильный" способ. Позволяет изменять кнопки в редакторе, и уже имеет все функции для лога информации о шорткате. Но при этом имеет ряд недостатков: 1. Поддерживает только IE_Pressed и IE_Repeat, но не IE_Released. 2. Работает, только если никто другой не заберет инпут Key, и не переключит фокус на себя.
Теперь как добавить. Каждый FUICommandInfo создается через переменную команды, которая регистрируется в:
class FBuildingToolsEditorCommands : public TCommands<FBuildingToolsEditorCommands>
{
public:
FBuildingToolsEditorCommands()
: TCommands<FBuildingToolsEditorCommands>(
"BuildingToolsEditor",
// Context name for fast lookup
NSLOCTEXT("Contexts", "BuildingToolsEditor", "Building Tools"),
// Localized context name for displaying
NAME_None,
//"LevelEditor" // Parent
FEditorStyle::GetStyleSetName() // Icon Style Set
)
{
}
virtual void RegisterCommands() override;
TSharedPtr<FUICommandInfo> Command;
};Регистрация модуля c Командами
Но от куда берется сама FBuildingToolsEditorCommands ? Она регистрируется в классе модуля через статическую функцию:
Добавление функции в шорткат
Теперь нужно добавить к FUICommandInfo функцию, которую она запустит. Для этого нужно получить FBuildingToolsEdModeToolkit :
Как создать Toolkit
В основном модуле необходимо создать толкит, и засетить его:
Добавить шорткат не в Commands класс
Самая большая беда, что один КоммандИнфо должен быть зареган лишь единожды и никогда больше. Если зарегестрировать дважды - будет краш. Поэтому нужно убедиться, что каждый комманд инфо будет уникальный
Создание комманды-класса
Для этой уникальности поместим каждую комманду в класс обжект
Теперь создаем наследника и указываем всю инфу о команде:
Регестрируем комманды классы
Так же как и раньше, но не совсем. Как можно видеть в прошлом блоке - использовался именно UI_COMMAND_EXT. Это нужно для того, чтобы регестрировать комманды именно в других функциях.
Но от куда у нас берется массив с командами:
Добавление функции на команду-класс
Добавление функции и удалять можно в любое время и в любой момент. Для этого достаточно ссылки на модуль с тоолкитом
Получение команды инфо по классу
НО для добавление МапАктион нужен КоммандИнфо класса. Для этого реалезуем Сатическую функцию получения:
Добавление IInputProcessor
Самый надежный способ принять инпут. Независимо от того, какой модуль сейчас в фокусе - Пре Инпут обработается перед этим. Для этого есть и ИнпутПроцессор. Создадим его:
Теперь зарегистрируем его. Если функция, зареганная в делегате вернет true - ипут дальше не пойдет. Если false - ипут идет дальше
Более простой способ
Есть обычный Pre Input Pressed делегат. Но он только на Pressed работает
Last updated
Was this helpful?