Unreal EngineのActorは、初期状態でプレイヤーの入力を受け取れないように設定されています。
プレイヤーの入力に対して処理を実行するときにはPawnを利用するのが一般的ですが、場合によってはActorでもプレイヤーの入力に対して処理を行いたい場合もあるかと思います。
そこで本記事では、Actorでプレイヤーからの入力を受け取る方法について、BlueprintとC++の両方で説明します。
Blueprintの場合
入力の有効化
Blueprintの場合はActorのBlueprintエディタを開き、DetailsタブのInputに配置されている Auto Receive Input を Player 0 に設定することで、Player Controllerからプレイヤーの入力を受け取ることができるようになります。
入力に対する処理の定義
プレイヤーの入力が有効化された状態で入力に対するイベントの処理を定義することで、プレイヤーの入力に対して処理を行うことができます。
ここでは、Axisに「AxisA」、Actionに「ActionB」が設定された場合を想定して入力に対する処理を定義する例を示します。
「AxisA」の入力を受け取る場合は「InputAxis AxisA」ノードを配置し、実行ピンの先に実行したい処理を定義していきます。
同様に「ActionB」の入力を受け取る場合は「InputAxis ActionB」ノードを配置し、実行ピンの先に実行する処理を定義します。
C++の場合
入力の有効化
C++の場合はメンバ関数 BeginPlay
をオーバーライドし、AActor
クラスに定義されたメンバ関数 EnableInput
を呼び出すことによってプレイヤーからの入力を受け取ることができるようになります。
引数には、PlayerController
を渡してあげる必要があります。
この例では、1番目の PlayerController
を渡しています。
void AInputEnabledActor::BeginPlay()
{
Super::BeginPlay();
// 入力を有効化
EnableInput(GetWorld()->GetFirstPlayerController());
// ...
}
入力に対する処理の定義
入力が有効になると、AActor
クラスに定義されている UInputComponent
のメンバ変数 InputComponent
が値が設定されます(EnableInput
を呼び出さないと、InputComponent
は nullptr
になります)。
入力が有効な状態になれば、あとは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と同様に行うことができます。