Virtualbird UG - Simple Controller (Advanced Input Device) Plugin

Documentation, Old reviews and questions, unrealmarketplace@virtualbird.de

This plugin is based on the SDL Framework (on desktop platforms) and allows the use of much more controllers under Unreal. It supports DirectInput, XInput and RawInput Controllers. It runs independently of the Unreal controller settings. Controller inputs are fired via new Events. You can use these Events in almost all Blueprints. Not only in the Player Controller Blueprint. They work independently of the Focus. Rumble is supported. Force Feedback since Version 1.5. Most PS5 DualSense functions are available. You can move the mouse cursor with a controller. Since version 3.0 simple mapping of buttons and axes possible. Keyboard and Mouse emulation. (Keyboard/Mouse) Button events can be triggered via functions. Mouse cursor can also be controlled via functions.

You can try the plugin before you buy it. Windows Demo Build , Windows Vehicle Demo Build, Android apk

Unreal Project (Plugin needed) 4.27 and higher

Vehicle Demo Project (Plugin needed) 4.24 and higher, 5.1 and higher

Local Multiplayer Demo Project (Plugin needed) 5.1 and higher, Video

Video of a customer demonstrating the mapping of a steering wheel.

For the Mac version since UE5.2, see Troubleshooting in the documentation.

Nativization in UE4 may cause problems and should be disabled in BPs that use this plugin.

For the latest plugin version for old Unreal version you have to compile the plugin yourself. See documentation. 

Changelog (4.27, 5.1 - 5.4)

  • (03/02/2025) Version 3.40: New: You can now use your smartphone as a gamepad. Minor bug fixes and changes to the FF.

  • (01/20/2025) Version 3.38: Problems under Linux with older UE versions fixed.

  • (12/17/2024) Version 3.37: Bugfix: The SDL2.dll file was not copied automatically because Epic always names the plugin directory differently since Fab.

  • (11/05/2024) Version 3.36: Bugfix: The death zone function had no effect in some events. Old UE versions now also get updates back to UE4.27.

Changelog (5.2, 5.3, 5.4)

  • (09/14/2024) Version 3.35: Android: Rumble support via Bluetooth. Tested with Android 14, but according to the API at least Android 12 is required.

  • (09/04/2024) Version 3.34: Bugfix. Plugin could no longer be compiled for Android.

  • (08/16/2024) Version 3.33: Bugfix. If you first loaded a mapping profile and then added a persistent axis event, the event did not work.

  • (08/10/2024) Version 3.32: Hotfix: The mapping did not work anymore in version 3.30 when using the tick event path. 

  • (08/01/2024) Version 3.30: Events are now determined per tick by default. This increases compatibility with certain systems. Linux benefits the most. Can be switched back to thread-based events in the settings.

  • (07/06/2024) Version 3.23: Stability improvements.

  • (06/10/2024) Version 3.22: UI functions added so that a menu can be controlled via the plugin. Source code is again compatible with UE4.27. Compatibility with Android increased and the Android path starts automatically. When connecting a steering wheel, FF settings are tested and set via a short FF effect. Can be deactivated via the settings. 

Changelog (5.1, 5.2, 5.3)

  • (02/21/2024) Version 3.20: The "Fire Keyboard Button Event" function has been added. This can be used, for example, to emulate the keyboard in order to control the UI via a gamepad. Android: Attach and Detach events work now. Controller Name, VendorID and ProductID are now read out. Battery is read out (Android 12). Rumble works partially. I will try to improve it. 

  • (02/12/2024) Version 3.19: The controller inputs on Android are now read out via the Android NDK instead of Unreal. This increases compatibility and flexibility. Rumble not yet possible. Variable "Tag" added to the action profiles. This allows you to search for them using the "getMappingActionsByTag" function and thus sort them better. More gamepads now fire the "DirectionalPad" event. 

  • (02/01/2024) Version 3.18: Mouse mapping bug fixes.

  • (01/30/2024) Version 3.17: Bug fixes for the functions that remove mappings. New functions "mapButton" and "mapAxis" added to perform mapping without user interaction or to overwrite a mapping. New function "createMappingFile" added to create a standard mapping. Many events now have the "ConnectionIndex" parameter. Removed function "setAxisMaxRange". The "setDeadZone" function has been extended instead. 

  • (01/15/2024) Version 3.16: New functions: getBallValueBySDL, getHatValueBySDL, getButtonValueBySDL, getAxisValueBySDL added. Dpad (Hat) can now be mapped as button. Minor bug fixes. 

  • (01/01/2024) Version 3.14: Added ButtonID/AxisID to the mapping function so that you can read out what the user has pressed in an already mapped action. Bugfix: Inverted mapped axis was inverted every time PIE was started. 

  • (01/01/2024) Version 3.12: New functions added to calibrate an axis. Mainly for pedals. You can now change the settings of running Autocenter and Constant-force effects. Bugfix: Deleted mapping was saved incorrectly. 

  • (12/26/2023) Version 3.11: Bug fixes in the Autocenter and Constant Force functions and stability improvements. 

  • (12/13/2023) Version 3.10: New function "fireMouseButtonEvent" added. Changed the StructID parameter in the mapping profile so that UE no longer displays error messages. Be sure to create a new ID!

  • (12/13/2023) Version 3.9: Inversion of axes bug fixed. SDL update to version 2.29.0 (Windows). This should improve the recognition of steering wheel accessories. Mobile devices are now supported. This runs via Unreal and not via SDL. As a result, the range of functions is much smaller and should be understood as "better than nothing" at the current state. 

  • (11/20/2023) Version 3.8: Fixed compilation errors on Linux.

  • (11/16/2023) Version 3.7: Added function "setUnrealKeyboardAndMouseEvents" so you can activate keyboard and mouse button events without using the mapping functions. A few small bug fixes.

  • (11/06/2023) Version 3.6: Bugifix in the setDeadZone function. Function "setAxisMaxRange" added.

  • (11/02/2023) Version 3.4: SDL settings can now be set in "Project Settings -> Engine -> Simple Controller Plugin". SDL update to version 2.28.5 (Windows).  

  • (10/02/2023) Version 3.3: Automatic detection if an axis value is between 0 and 1 or between -1 and 1 removed because too error-prone. Now everybody can determine this by himself via the function "addAxisCorrection". Some bug fixes.

  • (09/25/2023) Version 3.2: Keyboard and mouse support added*¹. New async functions for joysticks. New ForceFeedback functions (Stop, Update, Run). ForceFeedback steering wheel functions revised for higher compatibility. Deadzone function added. Other small improvements.  

Changelog (5.0, 5.1, 5.2)

  • (08/27/2023) Version 3.1: The initialization of the plugin within the engine will now be executed later. Stability improvements.

  • (08/19/2023) Version 3.0: Plugin now starts automatically. Gamepad events completely reworked. Completely new mapping functions and corresponding events added. New ForceFeedback functions for steering wheels. SDL updated. 

Does this plugin work with enhanced input? I’m currently working on a game and the only controllers we can get working are Xbox. If this does work with enhanced input I will most certainly be purchasing it

No, it is more of a substitute than a supplement. I even recommend deactivating the enhanced plugin. Why do you want to use the enhanced input plugin?

Is it possible to check whether a device is XInput?
I connected an Xbox One controller and retrieved the isXinput value from the Break Device Info node, but it was false.
The controller name was retrieved as “Xbox One Elite Controller,” which I believe is correct.
Does this happen when both XInput and DirectInput are supported? However, I don’t think the Xbox controller supports both.

Well, the recognition is … let’s say … :kissing_smiling_eyes:

image

I implemented it a long time ago and at that time it always had xinput in the name. Doesn’t seem to be the case anymore. I will remove it.

I think SDL2 does not return which API it uses. You can enable and disable the API you want to use in the plugin settings. Xbox controllers work with SDL also without XInput and even without DirectInput. Then it runs via HID.

Is there a reason why you want to know if it is an XInput device?

Thanks for checking it out.

My situation is that I’ve tried to make the player controls and UI controls compatible with a variety of gamepads and mouse/keyboards.

The UI controls were originally available for the XBOX pad and keyboard. When I used this plugin to add non-XBOX UI controls, for example DS4, the XBOX pad controls were duplicated.

Therefore, I thought of removing either the original UI control or the XBOX control part of this plugin. Unfortunately, the original one did not work, even though I edited C++. Therefore, I tried to filter the behavior of this plugin by whether it is Xinput or not.

However, this method would not work since it means that the XBOX pad is working with HID?. I was also trying to find a list of device ID and Xinput correspondence, but to no avail.

As a result, I will now consider implementing the UI control only with this plugin and my own keyboard input events.
I will look into cursor movement and selection handling with this plugin, while disabling the original gamepad and keyboard UI controls.

I remember seeing a function in the SDL code that does something like: if xinput else if directinput else if raw input ect. So you could add a variable there and then you would probably know which api is used. You would then have to use your own SDL version.

But if you want to use the menu functions of my plugin anyway it is easier to do this for all kinds of controllers I think.

Hi! I would like to know if the plugin works with CommonUI (Common Input Base Controller Data) to detect controller/keyboard switches?

The plugin has its own UI functions that are independent of the controller. I think Epic’s solution only supports XInput controllers, right? You might be able to mix it but I don’t recommend it.
Have a look at the demo project. There is also a UI demo.

I’m, trying to understand the sensor output of Dual Sense 5.

Can you tell me what values A,B and C are supposed to resemble for gyro and accelerator? It’s just all over the place.

Should be the X, Y and Z axes. Gyro and acceleration could be the other way around. I followed SDL’s instructions, even if I find that strange myself.

Ah I see! Thanks for the quick reply!

I assumed the same but I couldn’t find any sense in the actual values when moving or turning my DS5 in a certain direction :confused:

Oh is it an issue when I have gyro and accelerator enabled at the same time?
EDIT: Nvm even with your demo ui it doesn’t make sense imo

Another edit:

I saw the values visualized in DS4 as sliders and now it makes sense!

Both gyro and accelerator readings are based on movement speed. I had though the gyro would give me the tilt relative to 0 but it’s giving me rotational speed!

I have one of these gamepads and the values make sense. You just have to reverse the gyro and acceleration in your mind. At least that’s how it works for me.

1 Like

Hello! I am trying to get the web gamepad set up, but I’m having an issue with the left joystick. In UE5.5 the left joystick coming out of the async axis event, there is no axis value for Axis ID 0 or 1. In the UI html i added a console.log for the data the web socket is trying to sent and it looks good, but no data at all in coming through in editor.

Data is coming through for the right joystick, a, b, y, and start buttons (those are all my game uses)

Any thoughts on what might be misfiring?

By the way, I am so excited about this web ui gamepad! I totally flipped out when I saw the update!!!

I just downloaded the Windows demo and tested it with two PC browsers and my Android phone and both sticks worked. The “Player 2” in your screenshot indicates that you are using 3 browsers or 3 devices. Is that correct? If not, maybe something went wrong during testing. Restart the editor and try again.

I see that the Windows demo works great! The current setup I have is 1 controller and 2 browsers.

I tried restarting the editor and re-installing the plugin, but now luck.

Some more details -

  • I’m on UE 5.5.4
  • I am getting input info for axis events just not axis values
    image
  • Screenshot of the blueprints (this works for all controllers except web controller)

Ah, it’s about the Controller Axis event function. I looked in the code and the mobile controller is not there. Only controllers used via SDL2.
I will add it and update the plugin.

1 Like

Awesome thanks so much! :fire:

If you haven’t seen it yet, the update should be available. You also need to update the html file as I have added two variables that are transferred when connecting.