【UE5】C++を使って現在接続しているデバイスの情報を取得する

2024/10/29に公開

概要

以前コントローラーが動かなくなった時に、UE5側でデバイスを認識してるのか調べる方法を詳しく書こうと思い記事にしました
少しでも参考になれば幸いです。

https://zenn.dev/daria_nicht/articles/ue5-controller-not-working-tips

環境

UE5.4

手順

以下になります。

  1. Build.csにApplicationCoreを追加する
  2. BlueprintFunctionLibraryに関数を追加する
  3. BPで追加した関数を呼んでデバイス情報を取得する

Build.csにApplicationCoreを追加する

この機能を使うためには、Build.csにApplicationCoreを追加する必要がありますので追加してない方は追加していただけると助かります。

PrivateDependencyModuleNames.AddRange(
    new string[]
    {
        ...                //省略
        "ApplicationCore", //追加
    }
);

BlueprintFunctionLibraryに関数を追加する

この機能はSubsystemにはないですがSingletonみたいなので、以下のBlueprintFunctionLibraryを用意してBPで呼べるようにします

ExampleInputFunctionLibrary.h
#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "MyInputFunctionLibrary.generated.h"

UCLASS()
class ExampleInputFunctionLibrary : public UBlueprintFunctionLibrary
{
    GENERATED_BODY()
public:
    UFUNCTION(BlueprintCallable)
    static void GetAllConnectionDevice(TArray<FInputDeviceId>& OutInputDevices);
};


ExampleInputFunctionLibrary.cpp
void UMyInputFunctionLibrary::GetAllConnectionDevice(TArray<FInputDeviceId>& OutInputDevices)
{
    IPlatformInputDeviceMapper::Get().GetAllConnectedInputDevices(OutInputDevices);
}

BPで追加した関数を呼んでデバイス情報を取得する

先程追加した関数を呼びます。
自分はBP_ThirdPersonにこんな感じに処理を入れました。

今回注力してみる部分はこちらになります。

このInputDeviceSubsystemGetInputDeviceHardwareIdentifier関数に先程作った関数のデバイス情報を渡すと接続してるコントローラーやキーボード&マウスの情報が取れます。

返ってくる値にあるValuePrimaryDeviceTypeはSwitchで分岐するとこういう情報が取れるみたいです。
カメラやアーケードコントローラー?など、色々な種別が取れるみたいです。

今回は出力された情報をPrintStringでつなげるようにして何のデバイスが返ってきてるのか表示するようにしてます。

結果

上記のBPの状態で、 例えば コントローラーを入力してないとこうなります。

XInputのコントローラーを入力してる状態だとデバッグ情報はこうなります。
Gamepadと表示されているので、コントローラーの入力がされてるのが分かる状態になっています。

そして、DirectInputのコントローラーを接続しているが、RawInputプラグインを入れてないとこうなります。
なんかのデバイスは繋がってますが、それが何のデバイスなのかはわからないみたいです。

参考

How to get IPlatformInputDeviceMapper?

Discussion