Quick answer: ActivateActionSet is per-controller. Iterate GetConnectedControllers() and activate on every handle. Verify with GetCurrentActionSet. After every change to the VDF on Steamworks, publish a new revision and rebuild — otherwise the player loads the stale handle.
You ship a Steam Input layout with In-Game and Menu action sets. The player opens the menu and the menu still uses gameplay bindings. Steam logs show no error. You called ActivateActionSet, you double-checked the handle. The cause is almost always “you activated it on the wrong handle.”
The Symptom
Calling SteamInput.ActivateActionSet(controllerHandle, menuSetHandle) appears to succeed but bindings stay on the gameplay action set. Players experience “menu doesn’t respond” or “left stick doesn’t scroll the list.”
What Causes This
Steam Input action sets are per-controller. When a player has multiple connected controllers (Deck plus a wired pad, for example), each one has its own current set. Activating on one handle does not affect the others. If your code only activates on the “first” controller, the other controllers stay on the gameplay set.
The Fix
using Steamworks;
public class SteamInputBridge
{
private InputActionSetHandle_t _gameplay;
private InputActionSetHandle_t _menu;
private InputHandle_t[] _controllers = new InputHandle_t[Steamworks.Constants.STEAM_INPUT_MAX_COUNT];
public void Init()
{
SteamInput.Init(true);
_gameplay = SteamInput.GetActionSetHandle("InGameControls");
_menu = SteamInput.GetActionSetHandle("MenuControls");
}
public void SwitchTo(bool menu)
{
SteamInput.RunFrame();
var count = SteamInput.GetConnectedControllers(_controllers);
var set = menu ? _menu : _gameplay;
for (int i = 0; i < count; i++)
SteamInput.ActivateActionSet(_controllers[i], set);
}
}
Two things matter: RunFrame() first to refresh connected controller list, then loop and activate on every handle.
Verify with GetCurrentActionSet
var active = SteamInput.GetCurrentActionSet(_controllers[0]);
Debug.Log($"Active set on controller 0: {active.m_InputActionSetHandle}");
Debug.Log($"Expected: {_menu.m_InputActionSetHandle}");
If they don’t match, ActivateActionSet was called on the wrong handle, or the set name in the VDF doesn’t match what you passed to GetActionSetHandle.
VDF Revision Trap
If you renamed an action set on the Steamworks Input Configuration page (Player Configurator), you must publish the configuration. Drafts are not delivered to players. Until publish, GetActionSetHandle returns 0 (or the handle for the previous set name) and ActivateActionSet silently fails.
After publish, rebuild your Unity project. The build packs a copy of the VDF into the bundle; the published Steamworks copy is delivered separately on first launch.
The Steam Deck Path
Steam Deck inputs route through Steam Input automatically when the title is in the Steam Input for Gamepad whitelist. If you use Unity’s new Input System on the Deck without Steam Input integration, gamepad rebinds set in Big Picture have no effect. Either go all-in on Steam Input (this fix) or disable Steam Input for the title in your app config.
“Loop the controllers. Activate on every handle. Publish the VDF. Rebuild. The set switches.”
Related Issues
For Steam Input not registering at all, see Steam Input detection. For New Input System rebinds not persisting, see rebind persistence.
Iterate. Activate. Verify. Publish.