アンリアる! C++入門編 ~対話形式で学ぶUnreal Engine~
BOOTHでUnreal Engine C++入門書を販売していますUnreal Engine上でC++を使って開発するために必要となる基礎知識を一冊の本にまとめた本です。 対話形式によるわかりやすい説明を目指しました。無料の試し読みも可能ですので、ぜひ読んでみてください!
[UE4] Actorで入力を受け取る

Unreal EngineのActorは、初期状態でプレイヤーの入力を受け取れないように設定されています。
プレイヤーの入力に対して処理を実行するときにはPawnを利用するのが一般的ですが、場合によってはActorでもプレイヤーの入力に対して処理を行いたい場合もあるかと思います。

そこで本記事では、Actorでプレイヤーからの入力を受け取る方法について、BlueprintとC++の両方で説明します。

Blueprintの場合

入力の有効化

Blueprintの場合はActorのBlueprintエディタを開き、DetailsタブのInputに配置されている Auto Receive InputPlayer 0 に設定することで、Player Controllerからプレイヤーの入力を受け取ることができるようになります。

入力の有効化(Blueprint)

入力に対する処理の定義

プレイヤーの入力が有効化された状態で入力に対するイベントの処理を定義することで、プレイヤーの入力に対して処理を行うことができます。

ここでは、Axisに「AxisA」、Actionに「ActionB」が設定された場合を想定して入力に対する処理を定義する例を示します。
「AxisA」の入力を受け取る場合は「InputAxis AxisA」ノードを配置し、実行ピンの先に実行したい処理を定義していきます。
同様に「ActionB」の入力を受け取る場合は「InputAxis ActionB」ノードを配置し、実行ピンの先に実行する処理を定義します。

入力に対する処理の定義(Blueprint)

C++の場合

入力の有効化

C++の場合はメンバ関数 BeginPlay をオーバーライドし、AActor クラスに定義されたメンバ関数 EnableInput を呼び出すことによってプレイヤーからの入力を受け取ることができるようになります。
引数には、PlayerController を渡してあげる必要があります。
この例では、1番目の PlayerController を渡しています。

void AInputEnabledActor::BeginPlay()
{
    Super::BeginPlay();

    // 入力を有効化
    EnableInput(GetWorld()->GetFirstPlayerController());

    // ...
}

入力に対する処理の定義

入力が有効になると、AActor クラスに定義されている UInputComponent のメンバ変数 InputComponent が値が設定されます(EnableInput を呼び出さないと、InputComponentnullptr になります)。
入力が有効な状態になれば、あとはPawnと同様に入力に対する処理を定義するだけになります。

ここでは、BeginPlay で入力を有効にした直後に入力に対する処理を定義しています。

Pawnと同様に定義した入力に対する振る舞いを設定することも可能です。
この例では、他オブジェクトに入力を伝搬させるかを決める bConsumeInput と、ポーズ中にも入力を受け取れるようにするかを決める bExecuteWhenPaused について設定しています。

void AInputEnabledActor::AxisAProcess(float AxisValue)
{
    FVector NewLocation = GetActorLocation();
    NewLocation += FVector(0.0, AxisValue, 0.0);
    SetActorLocation(NewLocation);
}

void AInputEnabledActor::ActionBPressedProcess()
{
    UKismetSystemLibrary::PrintString(NULL, TEXT("ActionB Pressed"));
}

void AInputEnabledActor::BeginPlay()
{
    Super::BeginPlay();

    // 入力を有効化
    EnableInput(GetWorld()->GetFirstPlayerController());

    if (InputComponent)
    {
        // 入力「AxisA」に対する処理AxisAProcessを登録
        FInputAxisBinding& AxisBinding = InputComponent->BindAxis("AxisA", this, &AInputEnabledActor::AxisAProcess);
        AxisBinding.bConsumeInput = false;
        AxisBinding.bExecuteWhenPaused = true;

        // 入力「ActionB」に対する処理ActionBPressedProcessを登録
        FInputActionBinding& ActionBinding = InputComponent->BindAction("ActionB", IE_Pressed, this, &AInputEnabledActor::ActionBPressedProcess);
        ActionBinding.bConsumeInput = false;
        ActionBinding.bExecuteWhenPaused = true;
    }
}

まとめ

本記事では、Actorでプレイヤーの入力を受け取る方法について説明しました。

入力を有効化して受け取れるようにするためには、BlueprintとC++両方ともPlayer Controllerを設定する必要があることがわかりました。
一度Player Controllerを設定してしまえば、入力に対する処理など残りの処理についてはPawnと同様に行うことができます。