くーこのプログラマメモ

UE4などゲーム開発に関するメモ

IInputProcessorによるキー入力処理について

使用バージョン:UE4.24.3

はじめに

キー入力処理は通常ではPlayerControllerLevelActorWidget等で行っているかと思います。
個々のキー入力処理を行う場合であればこれで問題ないと思いますが、例えば「最後に入力されたデバイス(キーボードorゲームパッドorマウス)によって操作アイコンを変更したい」といった場合だと状況によってはキー入力処理が呼ばれない場合や複数箇所に処理が必要な可能性があり色々と不都合があります。
そういった場合はIInputProcessorを用いてキー入力処理を行う方法がよさそうです。

docs.unrealengine.com

キー入力処理が呼ばれない状況とは

PlayerControllerSetInputMode()を用いることでキー入力処理を制限することができます。
例えば、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を用いることで独自にキー入力処理することができます。
必ずしも利用される機能ではないかもしれませんが、状況を選ばずキー入力処理を行う必要がある場合は利用してみてもいいかと思います。