お世話になっております。
SteamControllerプラグイン使用時に任意のインデックスのコントローラーのコンテナIDを取得する方法はありませんでしょうか?
詳細:
次のような状況です。
- SteamControllerプラグインを使用
- Windowsプラットフォーム
- Windowsパソコンに Sony DualSense コントローラーを接続
- 複数のコントローラーを接続し対戦・協力できるゲーム
この状況で、任意のインデックスのコントローラーのコンテナID(Windows上でデバイスを識別できる"{0.0.0.00000000}.{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"のような文字列)を取得したいと考えています。
備考1:
最終的には任意のインデックスの Sony DualSense コントローラーに音声波形を流して振動させる狙いです。
コンテナID指定で音声波形を流し込む処理は実装済みです。(UE標準オーディオは使用していません)
Windows の API を使用し、接続されている全てのデバイスのコンテナ ID を列挙することはできるのですが、
そのコンテナ ID と「任意のキャラクターを操作しているコントローラー」との紐づけが不明で苦慮している状況です。
備考2:
Valve 社にも問い合わせ予定です。
よろしくお願いいたします。
再現手順
クラッシュなどの問題は発生していません。
お世話になっております。
調べたところで、残念ながらSteamController/SteamInputではWindowsのContainerIDを取得すること不可能かと思います。
SteamInputが提供するのは独自のコントローラーハンドルやエミュレートされたゲームパッドインデックスのみで、OSレベルのデバイス識別情報は意図的に隠されています。Unreal側で情報取得が厳しいかと思います。
そのためIndex Controller WindowsのContainerIDに対応付ける方法はありません。
詳細は以下を参照してください。
DualSenseの音声出力などでContainerIDが必要な場合は、WindowsAPIを使ってデバイスを特定する必要があります。
ただ、InputはRawInputプラグインを通じて実装して、RawInputまたはHIDを使用して、実際に入力を発生させている物理デバイスを取得し、そのデバイスをプレイヤーやキャラクターに関連付けます。その後SetupAPIを使ってDEVPKEY_Device_ContainerIdを取得します。この方法が唯一の確実な解決策です。
UE5ではSteamInputとは別に、Windows上でデバイス単位の入力を扱うためにRawInputプラグインを使用してください。
https://dev.epicgames.com/documentation/en\-us/unreal\-engine/rawinput\-plugin\-in\-unreal\-engine
オーディオ→SteamInput
Input→RawInputみたいな流れ分けることが可能かと思われます。
複雑で申し訳ないです。お手数ですが、よろしくお願いします。
お世話になっております。
ご多忙の中ご返信頂きありがとうございます。
おおよそ理解いたしました。
Win32APIを用いてHIDデバイスのコンテナIDを取得する方法は既に確立しているため、RawInputプラグインを使用してDualSenseを振動させること自体はできると思います。
少し解釈の仕方がわからない箇所があったためその点だけ追加で質問をさせてください。
> 調べたところで、残念ながらSteamController/SteamInputではWindowsのContainerIDを取得すること不可能かと思います。
> SteamInputが提供するのは独自のコントローラーハンドルやエミュレートされたゲームパッドインデックスのみで、OSレベルのデバイス識別情報は意図的に隠されています。Unreal側で情報取得が厳しいかと思います。
> そのためIndex Controller WindowsのContainerIDに対応付ける方法はありません。
> 詳細は以下を参照してください。
> ISteamInput Interface (Steamworks Documentation)
> DualSenseの音声出力などでContainerIDが必要な場合は、WindowsAPIを使ってデバイスを特定する必要があります。
> ただ、InputはRawInputプラグインを通じて実装して、RawInputまたはHIDを使用して、実際に入力を発生させている物理デバイスを取得し、そのデバイスをプレイヤーやキャラクターに関連付けます。その後SetupAPIを使ってDEVPKEY_Device_ContainerIdを取得します。この方法が唯一の確実な解決策です。
ここまでのお話を聞いて「SteamInputの使用をやめて、代わりにRawInputプラグインを使用する」というお話なのかと思いました。
しかしその後、下記のお話があったため「SteamInputとRawInputプラグインを併用する」というお話かもしれないとも思いました。
この辺りについてはどのように解釈すればよろしいでしょうか?
> UE5ではSteamInputとは別に、Windows上でデバイス単位の入力を扱うためにRawInputプラグインを使用してください。
> https://dev.epicgames.com/documentation/en\-us/unreal\-engine/rawinput\-plugin\-in\-unreal\-engine
> オーディオ→SteamInput
> Input→RawInputみたいな流れ分けることが可能かと思われます。
大変恐れ入りますがご確認のほどよろしくお願いいたします。
最初の回答が分かりにくくなってしまい、申し訳ありません。
SteamInputではWindowsのContainerIDのようなデバイス識別情報は取得できず、Steam独自のハンドルやエミュレートされたインデックスのみが提供されます。そのため、SteamInputのインデックスとWindowsのContainerIDを直接対応付ける方法はありません。
SteamInputをやめる必要はなく、RawInputと併用する形になります。SteamInputはゲームプレイ用の入力処理に使い、RawInputは物理デバイスを特定するためだけに使用します。RawInputで実際に入力を発生させたデバイスをプレイヤーやキャラクターに紐付け、その後SetupAPIを使ってContainerIDを取得し、DualSenseの音声や振動制御に利用します。
なお、手元にSteam Controllerがないため実機検証はできていませんが、Steam Controllerの場合は音声デバイスが1つだけ接続されることが多く、音声処理についてはSteamInput経由の方がシンプルになる可能性があると考えています。その点も含め、このSteamInputとRawInputを役割分担して使うハイブリッドな構成が、現実的に最も良い方法だと思います。
不明点があれば教えてください。
お手数ですが、よろしくお願いします。