Control Hints: Easily Show Your IAS Controls (PC, Xbox, PlayStation)

This is free and open-source with the MIT license. See below.

Creating and managing UI for showing game controls has always been one of those tedious tasks that plagued development. Everyone knows they should add it, but there’s no easy way of going about it. Look no further, I have the definitive solution for you. Control Hints integrates seamlessly with Input Action System (IAS) to generate pretty control hints complete with industry-standard icons for PC, Xbox, and PlayStation.

:star: Key Features

  • IAS Compatibility: Works with the standard IAS setup (Context → Action → Binding).
  • Xbox AND PlayStation: It’s time to grow up and include both in your game.
  • Icons Included: Icons with consistent styling and resolution are included. Only for commonly-used keys. Icons are free-use and come from Kenney input prompts (search on Google).
  • UI Included: Comes with pre-made no-frills UI that is production-ready and customizable.
  • Easy Icon Grab: If you simply want to grab an icon asset ID, you can do that, hassle-free!
  • Responsive UI: Optional feature to swap between solid and outlined icons based on InputAction state.

:joystick: Try Me!

An open-source FPS demo experience is available to test the capabilities of Control Hints:
Control Hints: FPS - Roblox

:white_check_mark: Ready in Five Steps

  1. Grab the free model: Control Hints
  2. Look for “TestMe” under main module “ControlHints”
  3. Move “TestMe” to StarterPlayerScripts
  4. Group all InputContexts into a Folder
  5. Set the inputContexts variable in “TestMe” to your new folder

Dive into the main module (ControlHints.lua) for detailed docs on setup and APIs.

Example Folder Structure

Organize your folder like this:

  • InputContext “Movement” (Enabled = true)
    • InputAction “JumpAction”
      • InputBinding “KeyboardJump” (KeyCode = Enum.KeyCode.Space)
      • InputBinding “GamepadJump” (KeyCode = Enum.KeyCode.ButtonA)
    • (Example Attributes of JumpAction: CustomName = “Jump”, CustomOrder = 1)

The module auto-sorts and displays hints with matching icons. By default, the name of the InputAction is displayed, but this can be overridden with the CustomName attribute. The CustomOrder attribute can override auto-sort for the affected InputAction.

Note: A folder is not necessary in this module. You just need an array of InputContexts to give to the module.

:warning: Known Limitations

  • No support for combined inputs (like A+B to awaken). But IAS also doesn’t support this, so whatever.
  • Included icons are only for commonly-used keys. Things like numpad keys or function keys are excluded.

License

MIT License

Copyright (c) 2025 ZurichBT

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

If you integrate this into your project, I’d love to hear about it. I’m curious. By the way, reply to this post if you need support or are giving feedback.

For those who come after. resources community-resources open-source input-action-system ias control-hints ui-module keyboard-input gamepad-support xbox-icons ps-icons roblox-ui scripting player-input dynamic-hints key-bindings roblox-module mit-license dev-tools game-controls hud-elements

45 Likes

It might be more ideal if you only show the gamepad hints relevant to the currently connected controller, which should be possible via UserInputService:GetStringForKeyCode.

2 Likes

Thank you for mentioning this. I’ll update the module tomorrow with this feature and other improvements.

4 Likes

Version 1.1 is released. Thank you, @TheGrimDeathZombie, for suggesting the method for gamepad type.

Important changes:

  • New “TestMe” LocalScript to quickly implement the UI.
  • Most functions in Module were replaced. See “TestMe” for example usage of new functions.
  • Module no longer auto-refreshes or creates connections. This is to avoid potential memory leaks and unintended behavior. See “TestMe” for example usage of connections.
  • Merged GamepadTemplate and KeyboardTemplate into HintTemplate.
  • Support added for multiple same-platform bindings for an action. Now, if you have an action like “Aim” that uses right click and Q, both will show with a customizable Separator (found inside HintTemplate).
  • Only one icon is displayed for gamepad, which is PlayStation for controllers with ButtonCross and Xbox for anything else.
  • Comments refined across the board to be more concise and informative.

Overall, the module is much more safe, stable, and flexible to use in your game.

The model has been updated. Get it here: Control Hints

2 Likes

Module is very nice, is there a way to make the action on the UI “fill up”? if the action is pressed?

1 Like

The icons are simple images and do not always fit perfectly square, so I imagine that a fill animation for the icons would be difficult to implement, especially given the sheer amount of icons.

However, I do have the images saved to create a new feature that replaces the hint icon with a solid version if the input is being pressed. Perhaps a clever workaround would be to slowly fade in the solid icon over the outline.

I will update the module with more fixes, tweaks, and this new feature. Planned release is tomorrow or the day after. Thank you for your suggestion!

2 Likes

nice module, i’ll be using this

1 Like

great module, I use a custom input system that generates all my InputActions and InputContexts on the fly, so I made a couple of tweaks:

Updated ControlHints:UpdateUI to include a check to ensure that inputAction.Enabled is true before showing it. This lets me hide individual hints without having to disable the entire context.

Refactored the connection part of the TestMe.lua example to also listen for new InputActions inserted into a pre-existing InputContext, calling ControlHints:UpdateUI whenever a new action is added or when any existing action’s Changed event fires.

1 Like

Thank you for the reply, I’ll be adding these tweaks as part of the next update. Let me know if you notice anything about using the module that makes you groan. I am eager to make the module as intuitive as possible.

1 Like

Version 1.2 is released. Thank you, @topdev @Ashi_Division, for your feedback.

Important changes:

  • New solid icons for all platforms
  • UpdateUI() now accepts an InputAction instance to update action icons without refreshing entire UI (called “partial update”)
  • Set USE_PRESSED_HIGHLIGHT boolean to true in ControlHints.lua to replace outline icons with solid icons based on state of InputActions
  • Set USE_PRESSED_HIGHLIGHT boolean to true in TestMe.lua to enable script connections for InputAction pressed/released events and to partially update UI
  • TestMe.lua now listens for DescendantAdded and DescendantRemoving events in inputContexts (was ChildAdded and ChildRemoved)
  • TestMe.lua now listens for Changed events for both InputContexts and InputActions
  • Module now checks if InputActions are enabled before adding them
  • Comments adjusted here and there for clarity

Try out the solid icons by setting USE_PRESSED_HIGHLIGHT to true for both TestMe.lua and ControlHints.lua. It is set to false by default.

The model has been updated. Get it here: Control Hints

2 Likes

I added this into my horror survival game and it just works perfect and looks simple. The latest update with the input highlight was a nice addition.

Appreciate this shared asset!

1 Like

I have a useless addition idea that no one will need but you could also add control hints for all the unused platforms in Enum.Platform

then again, I don’t think we are getting Roblox on Xbox 360 and the PS3 anytime soon..

1 Like

Hello,
thank you for this module, it looks awesome.
Could you also create a demo place, we could download, it would help me understand how to use it in my own game!

Thank you :slight_smile:

Edit : I ended up being able to use it, but it could be useful for someone else ^^

1 Like

You got it! Thank you for the feedback. I’ll get to work on the demo place, as well as other modifications to the module. Expect an update by next week.

2 Likes

Version 1.3 is released. Thank you, @winpol, for your suggestion of the demo place.

Important changes:

  • UI now uses Scale for all elements so that the control hints appear bigger on larger screens
  • SizeConstraint is used to ensure control hints doesn’t become too massive or too tiny
  • Base font size for ActionText has been increased for readability
  • New open-source FPS demo experience to experiment with the Control Hints module
  • TestMe.lua no longer initializes on mobile devices (totally forgot to do this earlier)

Control Hints should now appear more consistently and appropriately sized across varying screen sizes. The FPS demo experience uses Control Hints to its fullest extent. Try it here: Control Hints: FPS - Roblox

The model has been updated. Get it here: Control Hints

2 Likes

In the latest version, it is showing PlayStation buttons for Xbox…

*Im using Xbox One Series S

Xbox Screenshot

1 Like

Interesting. I’ll have to fix that. It is programmed to only use PlayStation if the button name for ButtonA is ButtonCross.

I am sorry; my clumsiness left a testing argument that forced PlayStation every time.

I have updated the model with the fix, it is now Version 1.31: Control Hints

Additionally, the demo experience has been updated with the fix.

1 Like

I notice that the demo experience (Control Hints: FPS - Roblox) breaks with PC, where mouse input bindings are not detected by IAS, causing the control hint to not show. At least, when playing on the client and not inside Studio. If anyone else has this issue, please let me know. I believe it has something to do with IAS still being in beta.

It looks like you are using getBindingKeycodes to determine if a binding should be displayed as a control hint, but the only two inputTypes are “Gamepad” and “Keyboard”. When it reaches a binding for a mouse input it is ignored because the binding instance name does not start with “Keyboard” (assuming you named it “MouseBinding” or something) when you are using mouse and keyboard.

1 Like