Skip to main content

Gamepad glyph switching

This guide explains the method for gamepad glyph switching in Common UI, which supports dynamic input glyphs for PlayStation and Xbox controllers on Windows.

Supported UE versions

UE 5.0 - 5.3

PlayStation controller setup

  1. Enable the WinDualShock plugin:
    • This plugin detects both DualShock (PS4) and DualSense (PS5) controllers.
    • Note: Requires a distribution license from Sony's PS4/PS5 SDK (LibScePad).

Windows DualShock plugin enabled

  1. Configure Controller Data:
    • Open the CommonInputBaseControllerData asset for PS4/5 controller
    • Ensure the Gamepad Name in unique (not "Generic")
    • Add entries in the Gamepad Hardware Id Mapping:
      • Input Device Name: FWinDualShock
      • Hardware Device Identifier:
        • DualShock4 (for PS4)
        • DualSense (for PS5)

DualShock controller data for PS4/5

UE 5.4+

PlayStation controller setup

  1. Enable New Plugins:
    • GameInput
    • GameInputWindows

Game Input Base and Game Input (Windows) plugins enabled

  1. Install Game Development Kit (GDK):

  2. Rebuild Plugins:

  • Rebuild the entire engine after GDK installation
  1. Configure Controller Data:
    • Open the CommonInputBaseControllerData asset for PS4/5 controller
    • Ensure the Gamepad Name in unique (not "Generic")
    • Add entries in the Gamepad Hardware Id Mapping:
      • Input Device Name: GameInput
      • Hardware Device Identifier:
        • DualShock (for PS4)
        • DualSense (for PS5)

Game Input Controller Data

  1. Additional Configuration:
  • Include the following in your DefaultInput.ini to allow recognition of the DualSense (PS5) and DualShock (PS4) devices:
[/Script/GameInputBase.GameInputDeveloperSettings]
+DeviceConfigurations=(DeviceIdentifier=(VendorId=1356,ProductId=1476),Description="PS4 Dual Shock controller",bOverrideHardwareDeviceIdString=True,OverriddenHardwareDeviceId="DualShock",bProcessControllerButtons=True,bProcessControllerSwitchState=True,bProcessControllerAxis=True,ControllerButtonMappingData=((1, "Gamepad_FaceButton_Left"),(2, "Gamepad_FaceButton_Bottom"),(4, "Gamepad_FaceButton_Right"),(8, "Gamepad_FaceButton_Top"),(16, "Gamepad_LeftShoulder"),(32, "Gamepad_RightShoulder"),(64, "Gamepad_LeftTrigger"),(128, "Gamepad_RightTrigger"),(256, "Gamepad_Special_Left"),(512, "Gamepad_Special_Right"),(1024, "Gamepad_LeftThumbstick"),(2048, "Gamepad_RightThumbstick"),(8192, "Gamepad_Special_Left")),ControllerAxisMappingData=((0, (KeyName="Gamepad_LeftX",DeadZone=0.239532,bIsPackedPositveAndNegative=True)),(1, (KeyName="Gamepad_LeftY",Scalar=-1.000000,bIsPackedPositveAndNegative=True)),(2, (KeyName="Gamepad_RightX",bIsPackedPositveAndNegative=True)),(3, (KeyName="Gamepad_LeftTriggerAxis")),(4, (KeyName="Gamepad_RightTriggerAxis",DeadZone=0.239532)),(5, (KeyName="Gamepad_RightY",Scalar=-1.000000,bIsPackedPositveAndNegative=True))),bProcessRawReportData=False,RawReportReadingId=0,RawReportMappingData=())
+DeviceConfigurations=(DeviceIdentifier=(VendorId=1356,ProductId=3302),Description="PS5 DualSense controller",bOverrideHardwareDeviceIdString=True,OverriddenHardwareDeviceId="DualSense",bProcessControllerButtons=True,bProcessControllerSwitchState=True,bProcessControllerAxis=True,ControllerButtonMappingData=((1, "Gamepad_FaceButton_Left"),(2, "Gamepad_FaceButton_Bottom"),(4, "Gamepad_FaceButton_Right"),(8, "Gamepad_FaceButton_Top"),(16, "Gamepad_LeftShoulder"),(32, "Gamepad_RightShoulder"),(64, "Gamepad_LeftTrigger"),(128, "Gamepad_RightTrigger"),(256, "Gamepad_Special_Left"),(512, "Gamepad_Special_Right"),(1024, "Gamepad_LeftThumbstick"),(2048, "Gamepad_RightThumbstick"),(8192, "Gamepad_Special_Left")),ControllerAxisMappingData=((0, (KeyName="Gamepad_LeftX",DeadZone=0.239532,bIsPackedPositveAndNegative=True)),(1, (KeyName="Gamepad_LeftY",Scalar=-1.000000,bIsPackedPositveAndNegative=True)),(2, (KeyName="Gamepad_RightX",bIsPackedPositveAndNegative=True)),(3, (KeyName="Gamepad_LeftTriggerAxis")),(4, (KeyName="Gamepad_RightTriggerAxis",DeadZone=0.239532)),(5, (KeyName="Gamepad_RightY",Scalar=-1.000000,bIsPackedPositveAndNegative=True))))