Hi all, I’ve spent my time implementing keyboard controls using Keymapper this week. In this blog, we’ll talk about a bit of the process and the final result.
A short introduction
By utilizing the key mapper, you can allow users to assign actions to keyboard keys or shortcuts, or to mouse or joystick buttons.
Users can go into the “keymaps” tab and change their keymappings from there.
In the original game, the ability to remap keys was already present.
As you can see Unrest allowed you to remap two “categories” of keys – Gameplay and Interface.
Process
Initially, I faced problems in implementing the keymaps correctly due to the way the keymap architecture worked.
From what I understand, the Keymapper architecture is primarily made of a collection of keymaps called a KeymapArray, where every keymap has a collection of actions.
Almost all the pre-existing engines utilized a single Keymap. However, our case required at least two Keymap(s) – one for the gameplay and one for the UI components.
You cannot simply add two Keymaps to the Keymapper because of the way inputs are handled in Unrest. Only a single Keymap needs to be active at any given time.
After some deliberation with my mentors, we came up with a simple solution. All I needed to do was simply switch to the UI Keymap when a UI component was visible on the screen and then switch back to the gameplay one once the UI component was closed. There was one small problem in this though, the game didn’t keep track of whether a UI element was being drawn on screen or not.
I went through the source code of the engine and noticed that a majority of UI components were inherited from the menu
class. I utilized this to my advantage and simply added the Keymap flipping logic to the menu class. This worked wonderfully, and now I was able to control most of the game using my keyboard!
Results
You are now able to remap three different categories of keymaps – Game, UI and HUD.
These are the default keymappings which you will be able to change as per your wish! 🙂
Thanks for reading!