Hey everyone! I just finished a UE5 plugin that I’m pretty hyped about. I was tired of the constant headache that comes with setting up different controllers—especially the nightmare of getting them to work natively on PC. So, I built a tool that handles everything. Whether your players are using a PS5 (DualSense), PS4, Xbox, or even the new Switch 2, the plugin detects it instantly—wired or wireless. No extra drivers, no DS4Windows, just native plug-and-play. What’s under the hood? Full Bluetooth Support: Native wireless connectivity for almost every controller. Instant Hot-Swap: Icons switch the second you swap controllers (PS5 icons, Xbox buttons, etc.). Enhanced Input & CommonUI: It’s built to play nice with the latest UE5 systems. If you’re tired of spending hours coding input logic or fighting with controller icons and Bluetooth sync, this is for you.
Hi David, I am excited about your plugin as I am currently working with a client that requires an all in one solution to gamepad.
I read through the store page and your documentation and i just wanted to confirm if xbox latest gen (X and S) controllers are supported and if it allows bluetooth / wireless connectivity with windows and mac?
Hi Caliviiiiiiiiiii, Xbox Series X/S controllers work perfectly with this plugin — no problem there at all, and honestly it handles pretty much any gamepad you throw at it, with wired and wireless/Bluetooth support. The one thing to flag: it’s currently Windows-only, no Mac support at the moment. Let me know if you have more questions!
I’m already using Common UI to switch between mouse+keyboard and x-box controller, and my common ui shows the correct mouse-keyboard or x-box controller/buttons on screen depending on what the user is playing with.
Is it easy to add your plugin to detect playstation controller (plugged into Windows machine) and update my common ui buttons to playstation ones (i already have the images)? I also want to keep existing functionality/buttons if player switches to mouse-keyboard or x-box controller.
Hi, @RadicalGratitud
Yes, and it goes further than just PlayStation. The plugin covers almost any controller and switches the prompts automatically between keyboard, Xbox, every PlayStation pad (PS3/PS4/PS5), Switch, and even generic controllers.
Best part for your case: it’s built on top of Common UI and UE5’s native input, so you don’t have to delete or redo anything you already have. Just two changes:
- Use the EGS Action Widget instead of the default Common Action Widget.
- In your Controller Data assets, add one array element to Gamepad Hardware Id Mapping, filling in the Input Device Name and Hardware Device Identifier of the controller those icons belong to.
That’s it. Your existing keyboard and Xbox prompts keep working exactly as they do now, and your PlayStation images get picked up automatically.
Also worth mentioning: the icons are just one part. Common UI only knows “gamepad or keyboard”, never what hardware is there. The plugin lets you detect which controller connected or disconnected, what type of controller is being used at any moment, and quite a few other things.
Full documentation here: https://battle-finch-8d4.notion.site/EGS_ControllerData_Setup-315acffa068880fa80baf7cc56a29521
And if you’d rather see it before deciding, you can download a demo build here and check for yourself what the plugin detects and what it can do with your own controllers: Demo Link
Thanks David, got it and it works quite well! I did re-write my custom user widget to have both the Enhanced Gamepad widget icon and text together.
I tried using TArray<FDataTableRowHandle> InputActions with Enhanced Gamepad Support widget but it didn’t work, so I used TObjectPtr<UInputAction> InputAction instead. Not sure if this InputActions is a bug on your end or mine.
FYI here is a snippet of what I tried to do (commented out the bug):
/* EGSActionTextWidget.h - Combines Enhanced Gamepad Support Action icon with a CommonTextBlock */
UCLASS()
class ULTIMATEUI_API UEGSActionTextWidget : public UCommonUserWidget
{
GENERATED_BODY()
protected:
// This looks for a widget named "ActionWidget" etc. in Blueprint hierarchy
UPROPERTY(BlueprintReadOnly, meta = (BindWidget))
TObjectPtr ActionWidget;
// The variables exposed to the Designer
// UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "BadToys|Input") // Does not work
// TArray<FDataTableRowHandle> InputActions; // Does not work
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "BadToys|Input")
TObjectPtr<UInputAction> InputAction;`
virtual void NativePreConstruct() override;
}
/* EGSActionTextWidget.cpp */
void UEGSActionTextWidget::NativePreConstruct()
{
Super::NativePreConstruct();
// Pass the parent's variable down to the CommonUI child widget
if (ActionWidget && InputAction) // && InputActions.Num() > 0) // InputActions does not work
{
// ActionWidget->InputActions = InputActions; // Does not work
ActionWidget->SetInputAction(InputAction);
}
}
Hi, @RadicalGratitud Thanks for the detailed report. That one’s on me, not on you.
InputActions is a leftover. It’s declared on the widget for Common UI compatibility, but nothing in the implementation ever reads it, so assigning it does literally nothing, and there was no way for you to know that without reading the source. I’ll remove it in the next update so nobody else runs into the same situation.
In case you were wondering how the icon resolves without it: instead of looking the key up in a data table, the widget asks Enhanced Input directly which keys are mapped to your Input Action, picks the gamepad or keyboard one depending on the detected input type, and then pulls the brush from your Controller Data assets, matching the connected controller through the Gamepad Hardware Id Mapping entry. The upside is that the icon follows your actual Input Mapping Contexts, including remapping at runtime, with no table to keep in sync.
So the solution is the one you already found. SetInputAction() isn’t a workaround, it’s the required way to do it, in my plugin and from a parent widget like yours: it sets the action and refreshes the icon in one call, whereas writing the property directly would leave the icon showing whatever it had before. Keep your TObjectPtr and your NativePreConstruct exactly as they are, that’s the correct setup.
One note on the design: it’s one action per widget, so if you need several actions in a row, use one of your combined widgets per action.
And if any other doubts come up, feel free to write to me at my support email, egsplugin@gmail.com. I can give you much better explanations there than in a comment thread.