GeeItSomeLaldy

InputBindingHelper.cs

Jun 6th, 2021 (edited)
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.08 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using UnityEngine;
  4. using UnityEngine.InputSystem;
  5.  
  6. public static class InputBindingHelper
  7. {
  8.     public static string ResolveControlScheme(this PlayerInput playerInput, string fallbackControlScheme = "Keyboard")
  9.     {
  10.         string controlScheme = playerInput.currentControlScheme;
  11.         if(string.IsNullOrWhiteSpace(controlScheme))
  12.         {
  13.             controlScheme = playerInput.defaultControlScheme;
  14.         }
  15.         if(string.IsNullOrWhiteSpace(controlScheme))
  16.         {
  17.             controlScheme = fallbackControlScheme;
  18.         }
  19.         return controlScheme;
  20.     }
  21.     public static string[] GetFirstBindingDisplayStrings(this InputAction action, string controlScheme, int bindingIndex = 0, string unboundString = "Unbound")
  22.     {
  23.         string bindingDisplayString = action.GetBindingDisplayString(group: controlScheme);
  24.         string[] splitStrings = bindingDisplayString.Split('|');
  25.         if (splitStrings.Length <= bindingIndex) return new string[] { unboundString };
  26.         string firstBinding = splitStrings[bindingIndex].Trim();
  27.         string[] resolvedBindings = firstBinding.Split('/');
  28.         return resolvedBindings;
  29.     }
  30.     /// <summary>
  31.     /// Get the sprite indices from a Sprite Asset for a specified action and Control Scheme
  32.     /// </summary>
  33.     /// <param name="spriteAsset">The sprite asset to check</param>
  34.     /// <param name="action">The Action to check</param>
  35.     /// <param name="controlScheme">The Input Control Scheme to check</param>
  36.     /// <param name="spriteIndices">the resulting sprite indices</param>
  37.     /// <param name="keys">The resolved keys in string format</param>
  38.     /// <param name="bindingIndex">Which binding index to check</param>
  39.     /// <returns></returns>
  40.     public static bool GetSpriteIndicesForAction(
  41.         this TMPro.TMP_SpriteAsset spriteAsset,
  42.         InputAction action,
  43.         string controlScheme,
  44.         out int[] spriteIndices,
  45.         out string[] keys,
  46.         int bindingIndex = 0)
  47.     {
  48.        
  49.         var displayKeys = action.GetFirstBindingDisplayStrings(controlScheme, bindingIndex);
  50.         List<int> spriteIndexList = new List<int>();
  51.         List<string> keyList = new List<string>();
  52.         bool allFound = true;
  53.         for(int i = 0; i < displayKeys.Length; i++)
  54.         {
  55.             var keyString = displayKeys[i];
  56.             if (i + 1 < displayKeys.Length)
  57.             {
  58.                 var nextKeyString =  displayKeys[i+1];
  59.                 var combinedSpriteName = $"{controlScheme} {keyString}_{nextKeyString}";
  60.  
  61.                 //look for combined keys, IE D-Pad/X or RS/Left. Exact matches only
  62.                 if (spriteAsset.FindSpriteIndexFromNameExact(combinedSpriteName, out int combinedIndex))
  63.                 {
  64.                     spriteIndexList.Add(combinedIndex);
  65.                     keyList.Add($"{keyString}/{nextKeyString}");
  66.                     i++;
  67.                     continue;
  68.                 }
  69.             }
  70.             var spriteName = $"{controlScheme} {keyString}";
  71.  
  72.             keyList.Add($"{keyString}");
  73.  
  74.             if (spriteAsset.FindSpriteIndexFromNameOrPartial(spriteName,out int index))
  75.             {
  76.                 Debug.Log($"sprite '{index}' found for '{keyString}'");
  77.                 spriteIndexList.Add(index);
  78.             }
  79.             else
  80.             {
  81.                 Debug.Log($"No sprite found for '{keyString}'");
  82.                 spriteIndexList.Add(-1);
  83.                 allFound = false;
  84.             }
  85.         }
  86.         keys = keyList.ToArray();
  87.         spriteIndices = spriteIndexList.ToArray();
  88.         return allFound;
  89.     }
  90.     public static bool FindSpriteIndexFromNameExact(this TMPro.TMP_SpriteAsset spriteAsset, string spriteName, out int spriteIndex)
  91.     {
  92.  
  93.         spriteIndex = spriteAsset.GetSpriteIndexFromName(spriteName);
  94.         if (spriteIndex >= 0)
  95.         {
  96.             return true;
  97.         }
  98.  
  99.         //Find exact match by name
  100.         var found = spriteAsset.spriteCharacterTable.Where(x => x.name == spriteName);
  101.         foreach (var f in found)
  102.         {
  103.             spriteIndex = spriteAsset.GetSpriteIndexFromHashcode(f.hashCode);
  104.             if (spriteIndex >= 0) return true;
  105.         }
  106.         spriteIndex = -1;
  107.         return false;
  108.     }
  109.     public static bool FindSpriteIndexFromNameOrPartial(this TMPro.TMP_SpriteAsset spriteAsset, string spriteName, out int spriteIndex)
  110.     {
  111.         if(spriteAsset.FindSpriteIndexFromNameExact(spriteName, out spriteIndex)) {
  112.             return true;
  113.         }
  114.         //Find partial match by name
  115.         var foundPartial = spriteAsset.spriteCharacterTable.Where(x => spriteName.ToLower().StartsWith(x.name.ToLower()));
  116.  
  117.         if (foundPartial.Count() > 0)
  118.         {
  119.             foreach (var f in foundPartial.OrderByDescending(fp => fp.name.Length))
  120.             {
  121.                 spriteIndex = spriteAsset.GetSpriteIndexFromHashcode(f.hashCode);
  122.                 if (spriteIndex >= 0) return true;
  123.             }
  124.         }
  125.         spriteIndex = -1;
  126.         return false;
  127.     }
  128.    
  129. }
  130.  
Add Comment
Please, Sign In to add comment