Controllers 3 and 4 assigned to players 1 and 2 in local multiplayer (Xbox)

Note: Although this issue seems to be exclusive of Xbox, my organization has yet to be granted access to the Xbox section of the forums, hence why I’m posting the question here. Once we gain access to the subforum, I will request the topic to be moved.

Hi all,

We are in the process of porting our local multiplayer (1-4) game to Xbox consoles and have run into an issue with the controllers that only happens on this console: gamepads 3 and 4 are not recognized as additional gamepads and the game processes their inputs as if they were gamepads 1 and 2.

There is a character selection screen where players press A once to join the game, and then press A again to confirm their character (and become “Ready”). Once everyone is ready, the gameplay begins.

When playing on an Xbox One and Series, after players 1 and 2 join, if players 3 and 4 press A in their respective controllers, they do not join the game with another character but confirm the character selection for 1 and 2.

The same setup / code works fine on PC and other consoles. We are not doing anything special to handle Xbox controllers, other than pausing the game when they get disconnected. It is also weird that only happens with 3+ controllers/players, while 2 work alright.

We are working on UE 5.3.2 and our GDK version is October 2022 GDKX Update 1 (10.0.22621.1877).

This is how the input is set up:

On Begin Play, three local players are created in addition to the first player that is created automatically. Their Controller Ids are -1 because according to the docs “a value of -1 specifies to use the next available ID”. So these players should be automatically assigned to controllers/gamepads 1 to 3 (0 being already assigned to the first player automatically).

In the character selection menu, we check on Tick if each player controller (from 0 to 3) has pressed the gamepad button to join the game. If a controller has pressed it for the first time, their corresponding character is spawned. If a controller has pressed the button and their character already exists, their character selection is confirmed. This check happens inside a Macro that receives the player controller.


(we know there are far better approaches for this, but it was done a long time ago and it’s worked so far, so please bear with us)

This is where the bug seems to be happening. When controller/gamepad 2 presses the button, the macro receives the player controller from Player Index 0 instead? So it acts as if the input was coming from controller 0?

If i’m not mistaken, calls to macros are independent of each other, so a call being made with controller 2 passed as an argument shouldn’t be overriden by another subsequent call with controller 0 as an argument, right?

So… Any ideas? Has anyone run into a similar problem before? Are we misinterpreting anything about how controllers and ids should be assigned? :smiling_face_with_tear: Thanks!

Adding a bit more info:

  • Apparently, sometimes gamepads 3 and 4 are both assigned to player/character 2, so character 1 is only controlled by gamepad 1, but character 2 is controlled by the other 3 gamepads.

  • After confirming the characters and proceeding to gameplay, the characters spawned in the character selection menu are destroyed, and new ones are created for the players to control during real gameplay. These characters, possessed by player controllers 1 and 2, can also be controlled by gamepads 3 and 4, so the issue persists outside the menu and with new character actors.

  • I would say that the last point confirms that several gamepads are being assigned the same id for some reason.

Some new findings: if we print the object name of the Return Value from Create Local Player (which is a Player Controller Object Reference), it prints as “none” on the console, while it shows the actual object name while playing on the editor. Perhaps the player controllers are not even being created, but why?

I posted the same question under a different account that has access to the Xbox subforum, but I’d like to leave this post up just in case someone that has an answer comes across it. Thanks!

More updates:

  • We believe that Create Local Player does work and it does create 3 additional player controllers, but they are still not being assigned correctly to each gamepad.

  • If we use the function Create Local Player For Platform User instead, only two player controllers are created. This is because Get All Active Users only finds 2 users despite 4 gamepads being connected

  • We have also tried using Set Local Player Controller Id to assign the ids manually, but according to the print message here, the same two player controllers are being assigned to 2 gamepads each. Get All Input Devices does return 4 devices.

  • We’ve looked at function CreateInputDeviceIdForDevice in XboxCommonPlatformInputDeviceMapper.cpp and the log “creating input device mapping for new device. FInputDeviceId=%d AppLocalDeviceId=%s” does appear for all 4 gamepads.