Quick answer: Steam Input exposes a virtual Xbox controller to your game, and your game is also reading the physical controller (DualSense, Switch Pro or a generic pad) directly. Choose one: opt that controller type out of Steam Input in Steamworks and keep native support, or rely on Steam Input and ignore the physical device while Steam is active.

Menus skip two items per press, characters jump twice, or a single player's controller shows up as player one and player two. It only happens when the game runs through Steam and usually only with PlayStation, Switch or generic controllers. Both Steam and your game are trying to support the same controller.

Why it happens

When Steam Input is enabled for a controller type, Steam reads the physical controller and presents a virtual Xbox (XInput) controller to the game. Steam tries to hide the physical device from the game, but games and input libraries that read HID devices directly can still see it. The game then has two gamepads fed by the same hands. Players running DS4Windows, reWASD or similar tools produce the same effect outside Steam.

Decide which path supports each controller

Either is fine. Doing both for the same controller type is what causes double input.

Fix 1: opt native controllers out of Steam Input

In Steamworks, open your app's Steam Input settings. You can declare which controller types your game supports natively, which tells Steam not to apply Steam Input to them by default. If your game handles PlayStation controllers itself, opt PlayStation controllers out and the virtual Xbox device disappears for them. Publish the change; players who manually forced Steam Input on for your game in their client settings still get it, which is worth a line in your FAQ.

Fix 2: ignore the physical device when Steam Input is active

If you prefer Steam Input, make sure only one device per player is read. Steam's virtual controllers use Valve's USB vendor ID, 0x28DE, which many input libraries expose. A simpler rule in Unity's Input System: when the game was launched by Steam and both a DualSense HID device and an XInput gamepad are present, disable the HID device.

using UnityEngine.InputSystem;
using UnityEngine.InputSystem.DualShock;
using UnityEngine.InputSystem.XInput;

void DedupePads()
{
    bool hasXInput = false;
    foreach (var d in InputSystem.devices) if (d is XInputController) hasXInput = true;
    if (!hasXInput) return;
    foreach (var d in InputSystem.devices)
        if (d is DualShockGamepad) InputSystem.DisableDevice(d);
}

Call it at startup and from InputSystem.onDeviceChange. Gate it on the game actually running under Steam so players without Steam keep their native controller, and adapt the idea for Switch Pro or generic devices.

Local multiplayer: one controller as two players

In couch co-op the duplicate device takes a player slot. The fixes above solve it; additionally, assign players by the first button press on each device rather than by device order, and show which device each player is on in the join screen so duplicates are obvious during testing.

What to tell players

Controller setups you cannot reproduce

Double input depends on the player's controller, Steam settings and background tools. Bugnet's SDKs for Unity, Godot and Unreal let players file an in-game report to which you can attach the connected device list as metadata, so the duplicate device is visible in the report instead of guessed at.

Frequently asked questions

Why does my controller input register twice in Steam games?

Steam Input presents a virtual Xbox controller while the game also reads the physical controller directly, so each press arrives from two devices.

How do I stop Steam Input from duplicating PlayStation controller input?

Opt PlayStation controllers out of Steam Input in your Steamworks Steam Input settings if your game supports them natively, or ignore the physical device while Steam’s virtual controller is present.

Can DS4Windows cause double input?

Yes. It creates a virtual Xbox controller alongside the real one. Use either it or Steam Input, and make sure the game reads only one device.

One controller, one translation layer. Steam Input or native support, never both.