Summary
On tvOS, gamepad button RELEASE events are never delivered once two or more GCControllers are connected. Presses arrive normally, but the key latches down, so any Enhanced Input action bound to Started/Pressed fires exactly once and never again.
With only one controller connected it works correctly. This is unavoidable on Apple TV because the Siri Remote is always a connected gamepad, so remote + any real gamepad = two controllers.
What Type of Bug are you experiencing?
Platform Other
Steps to Reproduce
- UE 5.8 project with Enhanced Input. Add IA_Jump (digital bool) mapped to
Gamepad_FaceButton_Bottom, with Started → Jump. - Package for tvOS (Development) and deploy to an Apple TV.
- Pair one gamepad (PS5 or Xbox). The Siri Remote is also connected, so the
device now has two controllers. - In game, press the jump button, release it, then press it again.
Expected Result
Jump triggers on every press.
Observed Result
Jump triggers on the first press only, then never again.
With LogEnhancedInput=Verbose, opening a menu 16 seconds after the last physical
press logs:
Key Gamepad_FaceButton_Bottom mapped to Input Action IA_Jump
will be ignored until released
FlushPressedKeys only flags keys it finds currently held, so Enhanced Input still
had the key DOWN 16 seconds after release. The release event never arrived.
UPlayerInput keys state per FKey rather than per device, so one missed release
latches that key for every connected controller.
Affects Versions
5.8
Platform(s)
iOS
Additional Notes
Controller count is the trigger (measured on device):
1 controller → works correctly
2 controllers → broken
3 controllers → broken
The second controller does not need to be touched, only connected.
The same project on iPad with a single controller works perfectly.
Already ruled out by testing on device:
- Enhanced Input flush / bShouldBeIgnored (logged once, paired correctly with its
clear) - bGameSupportsMultipleActiveControllers=True (made it worse: a second gamepad
stops driving the pawn entirely, and the Siri Remote as PlayerOne still jumped
only once) - Info.plist GCSupportedGameControllers = [ExtendedGamepad] only, MicroGamepad
omitted (verified present in the shipped plist; the Siri Remote still
enumerates) - Enhanced Input trigger configuration (with no release event, no trigger type can
distinguish “still held” from “pressed again”)
Possibly relevant, not verified as the cause:
FAppleControllerInterface::SendControllerEvents() swaps the shared members
CurrentButtonIndex/PrevButtonIndex INSIDE the per-connected-controller loop, while
ControllerButtons is only [2][MAX_NUM_CONTROLLERS] and CaptureControllerState
writes solely to [CurrentButtonIndex][ControllerIndex].
Environment: UE 5.8.0, Blueprint-only project, macOS host, Xcode 26.6,
Apple TV 4K 1st gen (AppleTV6,2), tvOS 26.6. Full device logs available on
request, and I can rebuild and test a hypothesis on hardware in a few minutes.