IInputProcessorによるキー入力処理について
使用バージョン:UE4.24.3
はじめに
キー入力処理は通常ではPlayerController
、Level
、Actor
、Widget
等で行っているかと思います。
個々のキー入力処理を行う場合であればこれで問題ないと思いますが、例えば「最後に入力されたデバイス(キーボードorゲームパッドorマウス)によって操作アイコンを変更したい」といった場合だと状況によってはキー入力処理が呼ばれない場合や複数箇所に処理が必要な可能性があり色々と不都合があります。
そういった場合はIInputProcessor
を用いてキー入力処理を行う方法がよさそうです。
キー入力処理が呼ばれない状況とは
PlayerController
のSetInputMode()
を用いることでキー入力処理を制限することができます。
例えば、InputModeUIOnly
に設定している場合はPlayerController
のキー入力処理が行われなくなります。
これ以外にも、以降のキー入力処理が行われないように入力の消費設定を行っている場合もあります。
準備
以下のモジュールを依存関係として追加する必要があります。
Slate
使い方
IInputProcessor
を継承したクラスを用意し、FSlateApplication
へ登録することで呼び出されるようになります。
登録するIInputProcessor
継承クラスはGameInstance
等で保持させておき、必要なタイミングで登録/解除を行います。
IInputProcessor
継承クラス
#pragma once #include "CoreMinimal.h" #include "Framework/Application/IInputProcessor.h" #include "InputProcessor.generated.h" class FInputProcessor : public IInputProcessor { using Super = IInputProcessor; public: virtual void Tick(const float DeltaTime, FSlateApplication& SlateApp, TSharedRef<ICursor> Cursor) override { } virtual bool HandleKeyDownEvent(FSlateApplication& SlateApp, const FKeyEvent& InKeyEvent) override { // 任意のキー押下イベント. return Super::HandleKeyDownEvent(SlateApp, InKeyEvent); } virtual bool HandleKeyUpEvent(FSlateApplication& SlateApp, const FKeyEvent& InKeyEvent) override { // 任意のキー離上イベント. return Super::HandleKeyUpEvent(SlateApp, InKeyEvent); } virtual bool HandleAnalogInputEvent(FSlateApplication& SlateApp, const FAnalogInputEvent& InAnalogInputEvent) override { // 任意のアナログ入力イベント. return Super::HandleAnalogInputEvent(SlateApp, InAnalogInputEvent); } };
FSlateApplication
の登録/解除
#pragma once #include "Framework/Application/SlateApplication.h" class FExample { private: TSharedPtr<FInputProcessor> InputProcessor = MakeShareable(new FInputProcessor()); public: /** InputProcessorを登録して有効にします */ void EnableInputProcessor() { FSlateApplication& SlateApplication = FSlateApplication::Get(); SlateApplication.RegisterInputPreProcessor(this->InputProcessor); } /** InputProcessorを登録解除して無効にします */ void DisableInputProcessor() { FSlateApplication& SlateApplication = FSlateApplication::Get(); SlateApplication.UnregisterInputPreProcessor(this->InputProcessor); } };
最後に
今回紹介したIInputProcessor
を用いることで独自にキー入力処理することができます。
必ずしも利用される機能ではないかもしれませんが、状況を選ばずキー入力処理を行う必要がある場合は利用してみてもいいかと思います。