Input Icons for Input System - Easily display action bindings

Asset Store
Edit: Version 3.0.0 is now available, bringing many new features, including multiple control schemes, improved button prompt components, local multiplayer support and more.
Edit: Version 4.0.0 is now available, new features: Facepunch Steamworks support, multiple user profiles for rebound bindings - perfect for family members with their own input preferences.
Check it out on the Asset Store page:
Input Icons for Input System

Transform Your Unity UI with Intelligent Input Prompts

Display the perfect controller button or keyboard key for any input action—automatically switching between devices as players do.

Seamless Integration Across Your UI

Show dynamic input prompts anywhere in your game:

  • SpriteRenderers for world-space UI
  • UI Images for canvas interfaces
  • TextMeshPro for seamlessly embedded controls in text
  • UI Toolkit support via free extension

Professional-Quality Assets

  • 1200+ High-Resolution Sprites (256Ă—256px) for every key and button - crisp visuals at any screen resolution
  • Custom SDF Font Pack for pin-sharp scaling at any size
  • Keyboard Layouts including QWERTY, QWERTZ, and AZERTY - support international players worldwide
  • All Major Controllers covered: Xbox, PlayStation (PS3-PS5), and Nintendo Switch with fallback mechanisms
  • Mobile Support for both Android and iOS interfaces

Industry-Ready Features

  • Automatic Device Detection - prompts update instantly when players switch input methods
  • Built-in Rebinding System - complete with save/load functionality - let players customize controls without extra coding
  • Player Profile Support - perfect for family computers and shared gaming setups
  • Local Multiplayer Support - display device-specific prompts for each player
  • Addressables Integration - optimize memory usage and load times
  • Full Documentation and Setup Videos - comprehensive guide with examples

Simple Implementation, Powerful Control

Display a jump prompt with a simple component setup or access advanced features when needed. Input Icons handles all the complexity of device detection and sprite management behind the scenes.

Update:
I published a free extension to support UI Toolkit as well. Get it here: Input Icons - UI Toolkit Extension

Hey, this asset is absolutely amazing, just got it today and it’s working great.
Thank you!

I am glad the asset suits your needs. There is currently an update on the way which fixes some issues people are experiencing.

  • In builds it can happen that the displayed bindings don’t update when changing from keyboard to controllers. To ensure this works, the InputIconsManager ScriptableObject has to be referenced somewhere once by a MonoBehaviour in a Scene. The next version (1.1.15) will provide a prefab which you can pull into your first scene, but you can of course also write your won Script which has a public ScriptableObject field which references the manager.
  • I encountered a bug in Input System 1.3.0 which prevents the user from rebinding a key to the letter E. Instead it will cancel the rebind operation. I found a solution thanks to this post: https://discussions.unity.com/t/870292/11

Thanks for the infos, very helpful.

Is it correct, that that the example scenes will not work after I’ve gone through the setup and added my own bindings to the style sheet etc?

Yes you are quite right.

If you use your own Input Action Asset for your controls, the rebind buttons in the example scene won’t work anymore, since they are referencing the actions of the example Input Action Asset and not yours. The displayed texts on the right will probably also not work correctly (only if you have the same action names as in the examples - e.g. PlatformerControls/Move or PlatformerControls/Jump).

The text on the left has a script which updates the text with the bindings of your used Input Action Asset. So this text should display all of your own bindings correctly once you start the scene. See the pictures below - the second image is a screenshot of a Input Action Asset I am using in another project. That asset has no attack action and therefore the the text on the right can not display an attack binding.
8488628--1129238--upload_2022-10-4_15-21-20.png 8488628--1129241--upload_2022-10-4_15-25-2.png

For the same reason it is important to do the setup again, once you change your Input Action Asset. For example if you add an attack action or other actions, you will have to add the new action(s) to the style sheet.
8488628--1129244--upload_2022-10-4_15-32-47.png

Uhm I guess that’s more than you have asked for, but I guess other forum users will find it useful as well.

Hi @tobias_froihofer ! I just bought your InputIcons package in the Unity Asset Store and I’m running into a problem trying to get this to work for an 8 player couch co-op game. I went through the setup instructions but immediately one of the things that happens is my PlayerManager no longer allows a second player to join for some reason.

A quick glance over the code tells me this won’t be a simple fix, so I was curious if you had any guidance before I start diving into this? Or am I missing something simple? Or is this planned at all?

I can put off the icon work here, but I’ve got a fairly intensive use case for icons in this project and I’d love to have an “out of the box” solution.

Thoughts?

Thanks!

For some context, here’s what the InputSystem’s Simple Multiplayer sample looks like with a simple TMP_Text on canvas with a simple style reference:

8729277--1181055--upload_2023-1-13_15-59-17.jpg

I can’t really spend any time looking into this right now (trying to hit a TIGHT deadline) but if there’s a relatively quick fix I’d love to hear it!

Hi @UnkelRambo , the asset in its current state is best used for singleplayer games. But depending on your needs, it can to some extend be used for multiplayer games as well. If you know that players will be using only one type of controllers (e.g. only XBox controllers, or only PlayStation controllers) it should be manageable with not too much of extra work.

Btw. I see that you get displayed a questionmark instead of an Input Icons sprite. This usually means that the sprite assets have not been properly created or that they have been created in a wrong folder. The default location for the sprite assets is “Assets/TextMesh Pro/Resources/Sprite Assets/”. If you have moved the TextMesh Pro folder to somewhere else, you will have to copy the created sprite assets to the new location. - or go to “Tools - Input Icons Setup”, update the “Default Sprite Assets folder” field and do the Quick Setup again and check if the sprite assets have been created correctly.

Here is a screenshot of the InputSystem’s Simple Multiplayer sample scene in which I joined with Keyboard, an XBox controller and a PS4 controller (I used Unity 2020.3.40f1, Input System 1.4.4 and Input Icons 1.1.21). As you can see, the displayed sprite is the same for each player, since the tool can only handle a single player input at a time and the assigned player input when I took the screenshot was the player input with the XBox controller.

Here is how I did it. First, in the InputIconsManager disable the “Can create Player Input OnLevelLoaded” checkbox. This option is new in the latest release of the tool. When disabled, no Player Input object should be created on the start of the scene which should allow you to join the scene via the Player Input Manager with keyboards and controllers. When I have this option enabled, I can not join the scene with the keyboard, but I can with controllers.
8731605--1181625--upload_2023-1-15_11-58-48.png

When you start the scene now, you might see a keyboard icon in the top of the scene, depending on the last used device. To display the icons of a specific user, you can drag the object with the Player Input component into the “Current Player Input” field of the InputIconsManager. To update that field at runtime, you would call InputIconsManagerSO.SetCurrentPlayerInput(PlayerInput).
8731605--1181643--upload_2023-1-15_12-19-2.png

Now the best way to support multiple devices at the same time would probably be to not display device specific prompts (e.g. XBox, PS, or Nintendo Pro) at all but rather use generic sprites for the North, South, East and West buttons like so:
8731605--1181658--upload_2023-1-15_12-35-6.png

To achieve this, you would first of all have to draw these sprites (fortunately I am currently working on additional sprites for this asset and will add generic sprites to the next update in a couple of days).
Then you would have to assign these sprites to a icon set (e.g. the XBox icon set, or a new icon set).
After that you would create a sprite asset out of that new generic icon set so you can actually display these sprites in TextMeshPro texts.
And as a last step you can assign that new generic icon set into the “Overwrite Gamepad Icon Set” in the InputIconSetConfiguratorSO. This will cause the tool to always display this icon set for every gamepad, ignoring the gamepad type.
8731605--1181655--upload_2023-1-15_12-34-55.png

So all in all probably not the best solution, but if you are okay to display the same sprites for each gamepad type, this might be fine.

Repeatedly setting the “Current Player Input” on the manager might be a bit annoying, but if you don’t need to display keyboard icons at all, changing a single line of code should be enough. Have a look into the InputIconsManagerSO.cs. In the UpdateTMProStyleSheetWithUsedPlayerInputs method you could change the line which reads
InputIconSetBasicSO iconSetSO = InputIconSetConfiguratorSO.GetCurrentIconSet();
to
InputIconSetBasicSO iconSetSO = InputIconSetConfiguratorSO.Instance.overwriteIconSet;
given that you are using a Overwrite Gamepad Icon Set.

Hope this helps, let me know if you are facing any troubles.

1 Like

Wow thank you so much for such a thorough response, this is great! My plan was to try doing exactly what you’re suggesting, using some generic “gamepad” input icons instead of the console specific versions. I think that will get me like 90% of the way there.

I’m debugging some other intense Unity Input System issues today so I might not get a chance to look at this for a bit, but I really appreciate the thorough response and will reply with an update when I’ve got it :smile:

1 Like

I am trying to show the input I want EG UPARROW instead of W. But when I change the Default Style Sheet or InputIconsManager it defaults back to what it was before, so I can never change it. How can I fix this to show the controls I want it to show?

Thanks!

Hi @VioletBeamGames .

Have a look at your Input Action Asset (where you have defined all your actions). The tool will display the binding which comes first in the list. I suppose your current setup looks something like this:

In that case, just dragging “Arrows” up to the top and saving the asset should do the trick. You might need to recompile or start the game to see the changes.

Thank you! I did that and it worked.

1 Like

Hi Tobias, thank you for this asset it seems to solve a lot of problems, unfortunately it doesn’t seem to work properly in my case. I get the same questionmark icon
"UnkelRambo" had, but I’m pretty sure I did the setup right. I have a feeling this might be because I’m on TMP version 3.2.0pre4 (we need it because of shadergraph support), and I had to import TMP as a local package to be able to compile input Icons for TMPro, as it needed access to “CreateSpriteAsset()”, which seems to be private in this version of TMP. I don’t know if anything else changed in this version, that prevents your asset to work properly. Do you have any idea what could have been gone wrong?

Thank you!

Hi @Onat-H , when you get questionmarks displayed, this usually means that the TMP object can not find the created Sprite Assets.

I have not yet tried doing the setup on that version of TMP. Did you get any errors when doing the first step of the setup in which you create the sprite assets?

If they got created correctly, it could also be that the created sprite assets got placed in the wrong folder. Normally they should get created in the default Sprite Assets folder of TMP since every TMP text component can access the Sprite Assets of that folder naturally. In your case you might need to have them in the subfolder of the 3.2.0pre4 version. You can specify the folder path to that folder in the setup window, or if the sprite assets already got created but are just in the wrong folder, you can also just drag them into the correct folder.

However, the “CreateSpriteAsset()” method should only be needed to create those Sprite Assets, which means you could also just create those assets in a different project and then copy them into your current project. To fix compiler errors you can then just delete the content of the CreateSpriteAsset method in you project using TMP 3.2.0pre4.

Hi Tobias,
thanks for the quick response! In fact I just disscovered what the problem was. (Although I don’t know why it happens), in my setup (Unity 2022.2 & TMP 3.2.0), the sprite packing seems to skip some steps. Once Packing is complete, I can see the actual Spritesheets and the TMP SpriteAssets, but the Spritesheets are set to “single” instead of multiple. Doing this manually and updating the Sprite Assets worked, but then your adjustments (like height etc.) weren’t applied. Once I create the sprite assets again through your setup, it recognized the already existing sprite atlas (which is now set to multiple), and does (almost) everything correctly.
Only minor problem is: While it understands that the atlases already exist and overwrites them, it doesn’t do so for the SpriteAssets and instead creates a copy with a number behind it. For now, just deleting the old sprite Assets befor creating the new ones works :slight_smile:

Thank you for you help and this amazing asset!

@Onat-H I did some tests and this is definitely a bug. When I tried to generate the Sprite Assets in a fresh project, the Sprite Assets would sometimes be set to multiple and sometimes to single. I will investigate and release an update as soon as possible once I found the issue. Thank you very much for making me aware of this one.

Btw. you can access the TMP_SpriteAssetMenu.CreateSpriteAsset method in 3.2.0 even though it is private by using reflection. This is generally not recommended, but this way you don’t have to have two versions of TMPro in your project just for creating the sprite assets. All you need to do is replace that one line with

System.Type assetMenu = typeof(TMP_SpriteAssetMenu);
MethodInfo method = assetMenu.GetMethod("CreateSpriteAsset", BindingFlags.NonPublic | BindingFlags.Static);
method.Invoke(null, null);

and add using System.Reflection; at the top of the file.

Edit: I found that if the Editor is set to 3D (in Project Settings - Editor - Default Behaviour Mode) the resulting sprites will sometimes be set to single but will always be multiple if set to 2D. I missed that one because my example project is set to 2D.

Edit2: In InputIconsSpritePacker at ~line 171 there was a mistake. The importer must first be set to textureType sprite and then to spriteImportMode Multiple. I did that in the wrong order, so swapping those two lines should fix the issue for 3D projects like this:
8964909--1231992--upload_2023-4-21_16-38-9.png
An update is on the way.

1 Like

Hello is that possible to make custom icons with that asset?

Yes to some extent. I created the icons in this package with Inkscape which is free. The package includes the .svg files with all the graphics for the keyboard and gamepad sprites. I created templates for the keys which means you can easy and quickly change the appearance of the keyboard sprites (unfortunately not the gamepad sprites) by just altering those templates. What you can do is a bit limited, but changing the color/gradient or doing some adjustments to the shape is very much possible.
8978998--1235134--upload_2023-4-28_10-34-39.png 8978998--1235137--upload_2023-4-28_10-36-30.png
You can then batch export all of the needed sprites at once using Inkscape which is very convenient.

I already bought it but You say that changing that to our own sprites wont change it ?

8979523--1235212--upload_2023-4-28_15-6-3.png

If yes then I will ask for refund as having own sprites is crucial for me

Also seems like Example scene dont work it shows BBC code instead of any icons