Базовая функция, оверайдить которую можно в любом модуле. Кей приходит только если никто другой не Занял кнопку, и фокус Модуль = модулю, где функция заоверайжена.
Что значит Занял кнопку ? Функция возращает боол. Если вернуть Тру - ипут остановится, и никаким другим модулем обрабатываться не будет. Т.е функции Ариала не сработают, например, Еск - не выполнит ничего, если инпут кей вернет тру.
Добавить шорткат
Создание команды
Самый "правильный" способ. Позволяет изменять кнопки в редакторе, и уже имеет все функции для лога информации о шорткате. Но при этом имеет ряд недостатков: 1. Поддерживает только IE_Pressed и IE_Repeat, но не IE_Released. 2. Работает, только если никто другой не заберет инпут Key, и не переключит фокус на себя.
Теперь как добавить. Каждый FUICommandInfo создается через переменную команды, которая регистрируется в:
classFBuildingToolsEditorCommands:publicTCommands<FBuildingToolsEditorCommands>{public:FBuildingToolsEditorCommands():TCommands<FBuildingToolsEditorCommands>("BuildingToolsEditor",// Context name for fast lookupNSLOCTEXT("Contexts","BuildingToolsEditor","Building Tools"),// Localized context name for displaying NAME_None,//"LevelEditor" // ParentFEditorStyle::GetStyleSetName()// Icon Style Set){}virtualvoidRegisterCommands()override; TSharedPtr<FUICommandInfo> Command;};
Регистрация модуля c Командами
Но от куда берется сама FBuildingToolsEditorCommands ? Она регистрируется в классе модуля через статическую функцию:
Добавление функции в шорткат
Теперь нужно добавить к FUICommandInfo функцию, которую она запустит. Для этого нужно получить FBuildingToolsEdModeToolkit :
Как создать Toolkit
В основном модуле необходимо создать толкит, и засетить его:
Добавить шорткат не в Commands класс
Самая большая беда, что один КоммандИнфо должен быть зареган лишь единожды и никогда больше. Если зарегестрировать дважды - будет краш. Поэтому нужно убедиться, что каждый комманд инфо будет уникальный
Создание комманды-класса
Для этой уникальности поместим каждую комманду в класс обжект
Теперь создаем наследника и указываем всю инфу о команде:
Регестрируем комманды классы
Так же как и раньше, но не совсем. Как можно видеть в прошлом блоке - использовался именно UI_COMMAND_EXT. Это нужно для того, чтобы регестрировать комманды именно в других функциях.
Но от куда у нас берется массив с командами:
Добавление функции на команду-класс
Добавление функции и удалять можно в любое время и в любой момент. Для этого достаточно ссылки на модуль с тоолкитом
Получение команды инфо по классу
НО для добавление МапАктион нужен КоммандИнфо класса. Для этого реалезуем Сатическую функцию получения:
Добавление IInputProcessor
Самый надежный способ принять инпут. Независимо от того, какой модуль сейчас в фокусе - Пре Инпут обработается перед этим. Для этого есть и ИнпутПроцессор. Создадим его:
Теперь зарегистрируем его. Если функция, зареганная в делегате вернет true - ипут дальше не пойдет. Если false - ипут идет дальше
Более простой способ
Есть обычный Pre Input Pressed делегат. Но он только на Pressed работает
void FBuildingToolsEditorCommands::RegisterCommands()
{
// FInputChord() - сюда указывать кнопку, на которую запускать команду
// EUserInterfaceActionType важна только для UI
UI_COMMAND(Command, "UniqueIDName", "CommandDescription",
EUserInterfaceActionType::Button, FInputChord());
// А это если мы хотим не создавать все команды EditorCommands, а создавать
// их где-то еще
for (const auto Command : BuildingToolsModes::GetCommands())
{
Command->RegisterUICommand(this);
}
}
void FBuildingToolsEditorCommands::RegisterCommands()
{
HarvestCommands();
// А это если мы хотим не создавать все команды EditorCommands, а создавать
// их где-то еще
for (const auto Command : Commands)
{
Command->RegisterUICommand(this);
}
}