You can use the “Axis Correction” functions. There is an example in the tooltip. You can also look in the mapping file that is created when you save. There you will find the parameters calibrationNegative and calibrationPositive.
Thank you very much for your reply. Let me explain my question in more detail. I have a remote control whose joystick values range from -0.6 to 0.6. I would like to calibrate it to range from -1 to 1. (With your method, I can only calibrate it to range from 0 to 1. I do not want to perform further data processing after calibration.)
I haven’t implemented a function for such values. You’ll have to convert them yourself.
Amazing! You already have my 5 star review, but if I could I’d give you 10 5 star reviews!
Coming in hot with another Web Controller question.
I am trying to use images as the visual for buttons and joysticks, but it looks like the MIME types are getting incorrectly classified. You can see the name on the left of the .png, but the Type gets classed as html.
Are there specific classifications you have set up that I can use .svg, .jpeg, etc.?
Here is a shot of the HTML/JS for the images being set.
(function() {
window.joystickImageInner = new Image();
window.joystickImageInner.src = "images/Sprites/shaded-light/shadedLight01.png";
window.joystickImageOuter = new Image();
window.joystickImageOuter.src = "images/Sprites/shaded-light/shadedLight07.png";
// Button A
window.aUnpressed = new Image();
window.aUnpressed.src = "images/Sprites/shaded-light/shadedLight36.png";
window.aPressed = new Image();
window.aPressed.src = "images/Sprites/flat-dark/flatDark35.png";
// Button B
window.bUnpressed = new Image();
window.bUnpressed.src = "images/Sprites/shaded-light/shadedLight37.png";
window.bPressed = new Image();
window.bPressed.src = "images/Sprites/flat-dark/flatDark36.png";
// Button X
window.xUnpressed = new Image();
window.xUnpressed.src = "images/Sprites/shaded-light/shadedLight38.png";
window.xPressed = new Image();
window.xPressed.src = "images/Sprites/flat-dark/flatDark37.png";
// Button Y
window.yUnpressed = new Image();
window.yUnpressed.src = "images/Sprites/shaded-light/shadedLight39.png";
window.yPressed = new Image();
window.yPressed.src = "images/Sprites/flat-dark/flatDark38.png";
// D-pad Left
window.dpadLeftUnpressed = new Image();
window.dpadLeftUnpressed.src = "images/Sprites/shaded-light/shadedLight05.png";
window.dpadLeftPressed = new Image();
window.dpadLeftPressed.src = "images/Sprites/flat-dark/flatDark04.png";
// D-pad Right
window.dpadRightUnpressed = new Image();
window.dpadRightUnpressed.src = "images/Sprites/shaded-light/shadedLight06.png";
window.dpadRightPressed = new Image();
window.dpadRightPressed.src = "images/Sprites/flat-dark/flatDark05.png";
// D-pad Down
window.dpadDownUnpressed = new Image();
window.dpadDownUnpressed.src = "images/Sprites/shaded-light/shadedLight10.png";
window.dpadDownPressed = new Image();
window.dpadDownPressed.src = "images/Sprites/flat-dark/flatDark09.png";
// D-pad Up
window.dpadUpUnpressed = new Image();
window.dpadUpUnpressed.src = "images/Sprites/shaded-light/shadedLight03.png";
window.dpadUpPressed = new Image();
window.dpadUpPressed.src = "images/Sprites/flat-dark/flatDark02.png";
})();```
Which comes out looking like this when working with only the .html file.

I'd be glad to use whatever format is available. I'd just hate to have to use Base64 to write the images :rofl:
I didn’t program a complete web server for this feature. Try it as a base64 string instead of linking to an image.
Cool, Base64 works just fine. Thanks for the quick reply!
Sorry, I feel like I keep bugging you about this webController.
How do you add extra axes? I have the triggers used in my game and they are axes 4 and 5. I don’t see a clear example of axes in the html though.
It truly is an amazing feature.
These two variables were added in the latest version:
let numAxes = 4;
let numButtons = 8;
You have to adjust the number accordingly. Every joystick has two axes. For the triggers, it will probably be one per trigger.
The values are sent via websockets. The protocol is very simple.
Axis command:Axis number:Axis value
websocket.send('a:0:0.123');
I think I found a bug, best I can tell.
Occasionally I get this error, which looks like an iterator invalidation error. I could be wrong on that though. I’m no C++ master.
LogOutputDevice: Error: === Handled ensure: ===
LogOutputDevice: Error: Ensure condition failed: this->Array.Num() == InitialNum [File:D:\RocketSync\5.5.0-37670630+++UE5+Release-5.5\Working\Engine\Source\Runtime\Core\Public\Containers\SparseArray.h] [Line: 1032]
LogOutputDevice: Error: Container has changed during ranged-for iteration!
LogOutputDevice: Error: Stack:
LogOutputDevice: Error: [Callstack] 0x00000209772f1f1d UnrealEditor-SimpleController.dll!`TSparseArray<TSetElement<TTuple<int,FSimpleControllerDevice *> >,TSparseArrayAllocator<TSizedDefaultAllocator<32>,FDefaultBitArrayAllocator> >::TRangedForIterator::operator!='::`2'::<lambda_1>::operator()() [D:\RocketSync\5.5.0-37670630+++UE5+Release-5.5\Working\Engine\Source\Runtime\Core\Public\Containers\SparseArray.h:1032]
LogOutputDevice: Error: [Callstack] 0x00000209772c4612 UnrealEditor-SimpleController.dll!USimpleControllerAxisAsyncEvent::firePersistentEvent() [D:\build\U5M\Sync\LocalBuilds\PluginTemp\HostProject\Plugins\SimpleController\Source\SimpleController\Private\SimpleControllerAsyncEvents.cpp:113]
LogOutputDevice: Error: [Callstack] 0x000002097728c574 UnrealEditor-SimpleController.dll!`USimpleControllerBPLibrary::axisMovedEventPersistent'::`27'::<lambda_4>::operator()() [D:\build\U5M\Sync\LocalBuilds\PluginTemp\HostProject\Plugins\SimpleController\Source\SimpleController\Private\SimpleControllerBPLibrary.cpp:1753]
LogOutputDevice: Error: [Callstack] 0x00007ffe3142e8ff UnrealEditor-Core.dll!UnknownFunction []
LogOutputDevice: Error: [Callstack] 0x00007ffe31452722 UnrealEditor-Core.dll!UnknownFunction []
LogOutputDevice: Error: [Callstack] 0x00007ffe31447d4a UnrealEditor-Core.dll!UnknownFunction []
LogOutputDevice: Error: [Callstack] 0x00007ffe314481ee UnrealEditor-Core.dll!UnknownFunction []
LogOutputDevice: Error: [Callstack] 0x00007ffe319d76c7 UnrealEditor-Core.dll!UnknownFunction []
LogOutputDevice: Error: [Callstack] 0x00007ffe319d91ba UnrealEditor-Core.dll!UnknownFunction []
LogOutputDevice: Error: [Callstack] 0x00000209377ff5db UnrealEditor-MassEntityEditor.dll!UnknownFunction []
LogOutputDevice: Error: [Callstack] 0x00007ffe2900939b UnrealEditor-UnrealEd.dll!UnknownFunction []
LogOutputDevice: Error: [Callstack] 0x00007ffe2e43ce75 UnrealEditor-Engine.dll!UnknownFunction []
LogOutputDevice: Error: [Callstack] 0x00007ffe29043d3a UnrealEditor-UnrealEd.dll!UnknownFunction []
LogOutputDevice: Error: [Callstack] 0x00007ffe29cd42c6 UnrealEditor-UnrealEd.dll!UnknownFunction []
LogOutputDevice: Error: [Callstack] 0x00007ff648fb6b47 UnrealEditor.exe!UnknownFunction []
LogOutputDevice: Error: [Callstack] 0x00007ff648fd57ac UnrealEditor.exe!UnknownFunction []
LogOutputDevice: Error: [Callstack] 0x00007ff648fd589a UnrealEditor.exe!UnknownFunction []
LogOutputDevice: Error: [Callstack] 0x00007ff648fd9114 UnrealEditor.exe!UnknownFunction []
LogOutputDevice: Error: [Callstack] 0x00007ff648febd04 UnrealEditor.exe!UnknownFunction []
LogOutputDevice: Error: [Callstack] 0x00007ff648fef0ba UnrealEditor.exe!UnknownFunction []
LogOutputDevice: Error: [Callstack] 0x00007fff33c9e8d7 KERNEL32.DLL!UnknownFunction []
LogOutputDevice: Error: [Callstack] 0x00007fff3471c34c ntdll.dll!UnknownFunction []
The error doesn’t always crash the game, but when it does, this is the crash error I get. This error can also be caused when the game is closed sometimes…
LoginId:131ea4124649b3c7484c5ab595e9580b
EpicAccountId:bd1e40351a9948d2adf12232e634a8a9
Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x0000000000000000
UnrealEditor_SimpleController!FSimpleControllerWebsocketThread::Run() [D:\build\U5M\Sync\LocalBuilds\PluginTemp\HostProject\Plugins\SimpleController\Source\SimpleController\Private\SimpleControllerWebserver.cpp:24]
UnrealEditor_Core
UnrealEditor_Core
kernel32
ntdll
I haven’t found a reliable way to reproduce the errors yet, but if I do, I’ll let you know!
All of this was tested/produced while using UE5.5.4 & 2 to 3 connected web controllers & default ui.html and qr & Event Init in game instance “startControllerWebserverAsync” & Event Shutdown in game instance “StopControllerWebserver”
Smells like a race condition. I’ll take a look at it tomorrow. Thanks for reporting it.