なれはて日記

ざんぞうです

UE4/C++ Tickでアクションの入力を監視する

前回でキーボードからの入力が受け取れるようになりました。
meeeeee1021.hatenablog.com
今回はUE4で設定したアクションでバインドしたキーの入力を監視したいです。

アクションのバインド

アクションのバインドはプロジェクト設定のインプットから設定します。
「K」か「左クリック」でAttackが発火するようにしました。
(日本語設定なのがばれてしまった!あまりメリットがないので英語に戻したいです。)

f:id:meeeeee1021:20220122022717p:plain
UE4 Input

MyPlayerController.h

前回と同じなのではしょります。

MyPlayerController.cpp

PlayerInput->GetKeysForAction(FName)からバインドされたキー配列を取得し、
一つずつ入力を確認します。

#include "MyPlayerController.h"
#include "GameFramework/PlayerInput.h"

void AMyPlayerController::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

    // Actorなどで監視する場合はPlayerControllerを取得する必要がある
    // APlayerController* pc = UGameplayStatics::GetPlayerController(this, 0);

    // アクションの監視
    char* actionName = "Attack";
    TArray<FInputActionKeyMapping> keyMapping = PlayerInput->GetKeysForAction(actionName);
    for (auto keyMap : keyMapping)
    {
        if (IsInputKeyDown(keyMap.Key))
        {
            float time = GetInputKeyTimeDown(keyMap.Key);
            UE_LOG(LogTemp, Log, TEXT("press %s: %f"), *keyMap.ActionName.ToString(), time);
            break;
        }
    }
}

「K」か「左クリック」でログが出るようになりました。やったー!
しかし、押したら毎フレーム実行されると気まずいです。
InputKey関数さんが押した離したのを見てくれるようなので明日また調べてみます。