For your default left-side layout, you might consider a virtual joystick, which is configurable (across a 3 x 3 grid or as a standalone control) for 4 way directional play (clockwise, up-right-down-left) or 8 way directional play (clockwise, north (up), north-east, east (right), south-east, south (down), south-west, west (left), north-west, depending on your game play.
For your default right-side layout, you might consider 2 buttons side by side (double spaced but in thumb range), where the right-most button is the fire button, and left-most button (I imagine) the lesser used toggle-map button.
In your settings, I suggest the functionality for players to tailor (swap) the layout for right and left handed players.
For intense game play, hardware controls are superior to on screen controls, so sometimes you need to adjust the game physics for platforms with on-screen controls to facilitate a level playing field for users.
@DaveS, assuming you are in Swift, here’s a 4 year old tutorial, which I believe is still be relevant. iOS Joystick in Swift and Sprite Kit (NEW) - YouTube . Some of the commenters nuanced the solution in useful ways as well. I hope that helps.
This is an iPad app, which can also run directly on ARM mac desktops, so when that is happening, these controls do not appear, as the desktop keyboard is used instead.