Я пытаюсь создать UActorComponent, который будет обрабатывать некоторый пользовательский ввод. Я делаю это следующим образом:
void MyComponent::BeginPlay()
{
Super::BeginPlay();
this->InputComponent = GetOwner() ->FindComponentByClass<UInputComponent>();
if (this->InputComponent != nullptr) {
UE_LOG(LogTemp, Display, TEXT("%s InputComponent Found"), *(GetReadableName()));
this->InputComponent->BindAction("MyAction", IE_Pressed, this, &MyComponent::ActionStart);
this->InputComponent->BindAction("MyAction", IE_Released, this, &MyComponent:: ActionEnd);
UE_LOG(LogTemp, Display, TEXT("%s InputComponent Binding done"), *(GetReadableName()));
}
}
Однако методы компонента никогда не вызывались. Я обнаружил, что все привязки пропали после вызова метода Pawns SetupPlayerInputComponent
. Если я делаю все крепления внутри SetupPlayerInputComponent
все крепления работают правильно.
Итак, каков наилучший способ обработки пользовательского ввода внутри UActorComponent, или это вообще не очень хорошая практика?
Как вы упомянули, привязки работают, если вы вызываете функции внутри SetupPlayerInputComponent
, поэтому самым простым решением было бы создать функцию в вашем компоненте с именем SetupInput
и вызвать эту функцию из функции SetupPlayerInputComponent
вашей пешки.
И да, на мой взгляд, привязки должны обрабатываться либо контролируемой пешкой, либо контроллером игрока, поскольку именно так работает игровая среда ue4. Я бы переместил все свои входы внутрь контроллера, если у вас нет какой-либо конкретной пешки для управления, или если это просто камера, перемещающая ее внутри самой пешки.
это действительно не должно быть проблемой производительности. Вы должны оптимизировать код, как только обнаружите, что он медленный;) Также движок должен без проблем обрабатывать сотни привязок клавиш.
Но дело не в производительности, а в организации кода :-)
О, тогда я бы порекомендовал выполнить обработку ввода и настройку, связанную с вводом в чертежах? А остальное на С++. Меня раздражало управление вводом из C++, особенно когда он часто меняется и приходится добавлять больше элементов.
Спасибо. Совет по ставкам, который я недавно нашел.
Внутри SetupPlayerInputComponent
InputComponent->BindAction("MyAction", IE_Pressed, MyComponentRef, &MyComponent::ActionStart);
Что касается того, является ли это хорошей практикой или нет, у нее могут быть свои преимущества, в основном для уменьшения беспорядка или повторного использования обработчиков ввода в нескольких несвязанных подклассах APawn.
Спасибо @josip-duvancic. Но как насчет повторного использования? Если у меня есть 5-10 типов костюмов, которые по-разному обрабатывают мой ввод, мой контроллер игрока будет иметь множество методов, которые не будут использоваться большую часть времени.
Любой я мертв, как я могу разделить обработку ввода для разных контекстов? Если у меня есть 5-10 типов костюмов, которые по-разному обрабатывают мой ввод, мой контроллер игрока будет иметь множество методов, которые не будут использоваться большую часть времени.