Привязать пользовательский ввод к методам UActorComponent в UE4.22.3 и выше

Я пытаюсь создать 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, или это вообще не очень хорошая практика?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 801
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как вы упомянули, привязки работают, если вы вызываете функции внутри SetupPlayerInputComponent, поэтому самым простым решением было бы создать функцию в вашем компоненте с именем SetupInput и вызвать эту функцию из функции SetupPlayerInputComponent вашей пешки.

И да, на мой взгляд, привязки должны обрабатываться либо контролируемой пешкой, либо контроллером игрока, поскольку именно так работает игровая среда ue4. Я бы переместил все свои входы внутрь контроллера, если у вас нет какой-либо конкретной пешки для управления, или если это просто камера, перемещающая ее внутри самой пешки.

Любой я мертв, как я могу разделить обработку ввода для разных контекстов? Если у меня есть 5-10 типов костюмов, которые по-разному обрабатывают мой ввод, мой контроллер игрока будет иметь множество методов, которые не будут использоваться большую часть времени.

Sergey Pekar 26.07.2019 12:56

это действительно не должно быть проблемой производительности. Вы должны оптимизировать код, как только обнаружите, что он медленный;) Также движок должен без проблем обрабатывать сотни привязок клавиш.

Playdome.io 29.07.2019 17:12

Но дело не в производительности, а в организации кода :-)

Sergey Pekar 01.08.2019 13:24

О, тогда я бы порекомендовал выполнить обработку ввода и настройку, связанную с вводом в чертежах? А остальное на С++. Меня раздражало управление вводом из C++, особенно когда он часто меняется и приходится добавлять больше элементов.

Playdome.io 01.08.2019 19:07

Спасибо. Совет по ставкам, который я недавно нашел.

Sergey Pekar 04.08.2019 17:17

Внутри SetupPlayerInputComponent

InputComponent->BindAction("MyAction", IE_Pressed, MyComponentRef, &MyComponent::ActionStart);

Что касается того, является ли это хорошей практикой или нет, у нее могут быть свои преимущества, в основном для уменьшения беспорядка или повторного использования обработчиков ввода в нескольких несвязанных подклассах APawn.

Спасибо @josip-duvancic. Но как насчет повторного использования? Если у меня есть 5-10 типов костюмов, которые по-разному обрабатывают мой ввод, мой контроллер игрока будет иметь множество методов, которые не будут использоваться большую часть времени.

Sergey Pekar 26.07.2019 12:53

Другие вопросы по теме