Second, I tried to get it working by enabling the WinDualShock plugin, which again works great when NOT connected to Steam, but once Steam gets involved everything gets funneled through XInput and that plugin appears to have no way to identify PS4/5 gamepads since it always just calls them “XInputDevice” with no further information for figuring out what it actually is. In addition, if I try to swap gamepad at runtimes things get completely broken and gamepad input stops working at all. If I disable the XInput plugin then no gamepads work at all. It seems like WinDualShock is not compatible with Steam in any way since it never detects the gamepad.
In previous projects to work around these problems I had to write a custom input interface that did a ton of SteamAPI calls to figure out the gamepad but it was a lot of work and took a lot of research that I don’t have anymore. I really do not want to have to go this route because we don’t have time for it.
Is this just a known problem that PS4/5 gamepads are still not properly supported on Steam? Is there any way to get the GameInput.dll to work? If that could be fixed then everything would work perfectly, but I cannot for the life of me figure out how to get it to load when running through Steam. It somehow blocks it completely, probably due to whatever input handling the platform is doing.
It seems to me like this is still an unsolved problem with no built in solution, which is pretty surprising. If this is not the case then please advise on how to get this working.
Steps to Reproduce
Plug in a PS4/5 gamepad on Windows then run the game through Steam. There will be no way to identify which one is currently being used and the functionality is very buggy if you unplug and try to swap to a different gamepad.
For what I know that issue you are seeing is expected. The Steam client enables its own Steam Input layer, which takes control of connected controllers before other input APIs (such as Raw Input or Game Input) are initialized (overall Unreal Input). Because of this, Unreal’s Raw Input plugin never sees devices that are hot-plugged, and DLLs you expect like GameInput.gll are not loaded. This behavior is managed by Steam itself, rather than Unreal.
If your title is distributed through Steam and you need to differentiate between different controllers, the most reliable approach is to integrate with the Steam Input API directly. As you already mentioned, steam provides a way to differentiate this and with time is definitly the way to go.
Outside Steam, wthin Unreal, the recommended alternative to Raw Input is to use the Input Device Subsystem in combination with the Game Input plugin on Windows. As mentioned previously, those IDs are abstracted away by Steam, and you will still need Steam’s API to correctly resolve controller models.
We have escalated this behavior to Epic to check if there is an official workaround or guidance for developers relying on Steam Input. Since this involves a third-party platform layer, it may take some time to get a definitive response. I’ll update this thread as I get a response from Epic.
I just received a response from Epic. Unreal itself doesn’t have any built-in support for Steam Input. When a game runs through Steam, by design it takes over and presents every controller as an XInput device. Unreal will always receive them as XInput controllers, and that behavior can’t be controlled from within the engine.
If the user wants native DualShock or DualSense support, things like the speaker, adaptive triggers, or LED lighting, Steam Input won’t expose those features. In that case, the player would need to disable Steam Input, and you as the developer would need to integrate WinDualShock. To do this, Sony’s licensed DLL is also required.
Summary: For a full native PlayStation controller experience, Steam Input has to be turned off, and the developer needs to implement support either with Sony’s tools or through the Steam APIs (as you’ve done in the past).
I’m not trying to get a full native experience, I just want to know when a PS4 or PS5 controller is plugged in, that’s all. There doesn’t appear to be any way to identify the controller because they are both reported with the same values in the FInputDeviceScope struct. Both of them have InputDeviceName of “XInputInterface” and HardwareDeviceIdentifier as “XInputController” so there’s no way to even know it is a PS4/5 controller. Maybe the information is hidden deeper in the engine somewhere, but I haven’t been able to find it.
From Epic’s response, it seems that when a game is run through Steam, Steam Input takes control of all inputs and converts them to XInput right away. What Unreal receives is already the controller as an XInput device. There is no way for Unreal to detect whether the controller is a PS4 or PS5, because Steam has already converted it.
If you disable Steam Input, Unreal can see the actual type of controller. However, with Steam Input enabled, the only way to reliably know which type of controller is connected is to query the Steam API directly.