Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections.Generic;
- using System.Linq;
- using UnityEngine;
- using UnityEngine.InputSystem;
- public static class InputBindingHelper
- {
- public static string ResolveControlScheme(this PlayerInput playerInput, string fallbackControlScheme = "Keyboard")
- {
- string controlScheme = playerInput.currentControlScheme;
- if(string.IsNullOrWhiteSpace(controlScheme))
- {
- controlScheme = playerInput.defaultControlScheme;
- }
- if(string.IsNullOrWhiteSpace(controlScheme))
- {
- controlScheme = fallbackControlScheme;
- }
- return controlScheme;
- }
- public static string[] GetFirstBindingDisplayStrings(this InputAction action, string controlScheme, int bindingIndex = 0, string unboundString = "Unbound")
- {
- string bindingDisplayString = action.GetBindingDisplayString(group: controlScheme);
- string[] splitStrings = bindingDisplayString.Split('|');
- if (splitStrings.Length <= bindingIndex) return new string[] { unboundString };
- string firstBinding = splitStrings[bindingIndex].Trim();
- string[] resolvedBindings = firstBinding.Split('/');
- return resolvedBindings;
- }
- /// <summary>
- /// Get the sprite indices from a Sprite Asset for a specified action and Control Scheme
- /// </summary>
- /// <param name="spriteAsset">The sprite asset to check</param>
- /// <param name="action">The Action to check</param>
- /// <param name="controlScheme">The Input Control Scheme to check</param>
- /// <param name="spriteIndices">the resulting sprite indices</param>
- /// <param name="keys">The resolved keys in string format</param>
- /// <param name="bindingIndex">Which binding index to check</param>
- /// <returns></returns>
- public static bool GetSpriteIndicesForAction(
- this TMPro.TMP_SpriteAsset spriteAsset,
- InputAction action,
- string controlScheme,
- out int[] spriteIndices,
- out string[] keys,
- int bindingIndex = 0)
- {
- var displayKeys = action.GetFirstBindingDisplayStrings(controlScheme, bindingIndex);
- List<int> spriteIndexList = new List<int>();
- List<string> keyList = new List<string>();
- bool allFound = true;
- for(int i = 0; i < displayKeys.Length; i++)
- {
- var keyString = displayKeys[i];
- if (i + 1 < displayKeys.Length)
- {
- var nextKeyString = displayKeys[i+1];
- var combinedSpriteName = $"{controlScheme} {keyString}_{nextKeyString}";
- //look for combined keys, IE D-Pad/X or RS/Left. Exact matches only
- if (spriteAsset.FindSpriteIndexFromNameExact(combinedSpriteName, out int combinedIndex))
- {
- spriteIndexList.Add(combinedIndex);
- keyList.Add($"{keyString}/{nextKeyString}");
- i++;
- continue;
- }
- }
- var spriteName = $"{controlScheme} {keyString}";
- keyList.Add($"{keyString}");
- if (spriteAsset.FindSpriteIndexFromNameOrPartial(spriteName,out int index))
- {
- Debug.Log($"sprite '{index}' found for '{keyString}'");
- spriteIndexList.Add(index);
- }
- else
- {
- Debug.Log($"No sprite found for '{keyString}'");
- spriteIndexList.Add(-1);
- allFound = false;
- }
- }
- keys = keyList.ToArray();
- spriteIndices = spriteIndexList.ToArray();
- return allFound;
- }
- public static bool FindSpriteIndexFromNameExact(this TMPro.TMP_SpriteAsset spriteAsset, string spriteName, out int spriteIndex)
- {
- spriteIndex = spriteAsset.GetSpriteIndexFromName(spriteName);
- if (spriteIndex >= 0)
- {
- return true;
- }
- //Find exact match by name
- var found = spriteAsset.spriteCharacterTable.Where(x => x.name == spriteName);
- foreach (var f in found)
- {
- spriteIndex = spriteAsset.GetSpriteIndexFromHashcode(f.hashCode);
- if (spriteIndex >= 0) return true;
- }
- spriteIndex = -1;
- return false;
- }
- public static bool FindSpriteIndexFromNameOrPartial(this TMPro.TMP_SpriteAsset spriteAsset, string spriteName, out int spriteIndex)
- {
- if(spriteAsset.FindSpriteIndexFromNameExact(spriteName, out spriteIndex)) {
- return true;
- }
- //Find partial match by name
- var foundPartial = spriteAsset.spriteCharacterTable.Where(x => spriteName.ToLower().StartsWith(x.name.ToLower()));
- if (foundPartial.Count() > 0)
- {
- foreach (var f in foundPartial.OrderByDescending(fp => fp.name.Length))
- {
- spriteIndex = spriteAsset.GetSpriteIndexFromHashcode(f.hashCode);
- if (spriteIndex >= 0) return true;
- }
- }
- spriteIndex = -1;
- return false;
- }
- }
Add Comment
Please, Sign In to add comment