using UnityEngine; using TMPro; using InputGlyphsFramework; public class GlyphService : MonoBehaviour { public static GlyphService Instance { get; private set; } public InputGlyphDatabase database; void Awake() { if (Instance != null && Instance != this) { Destroy(this); return; } Instance = this; } public bool TryGetTMPTagForActionPath(string controlPath, InputDeviceWatcher.InputDeviceCategory device, out string tag, out string displayFallback) { tag = null; displayFallback = null; if (string.IsNullOrEmpty(controlPath) || database == null) return false; // 优先查当前设备表 var entry = database.FindEntryByControlPath(controlPath, device); if (entry == null) { // 回退到 keyboard 表 entry = database.FindEntryByControlPath(controlPath, InputDeviceWatcher.InputDeviceCategory.Keyboard); } if (entry == null) { displayFallback = GetDisplayNameFromControlPath(controlPath); return false; } // 需要一个对应的 TMP Sprite Asset 来生成 标签 —— 查找 entry 所在的表(优先当前设备,再 keyboard) DeviceGlyphTable table = database.GetTable(device) ?? database.GetTable(InputDeviceWatcher.InputDeviceCategory.Keyboard); if (table == null || table.tmpAsset == null) { displayFallback = GetDisplayNameFromControlPath(controlPath); return false; } var sprite = entry.Sprite; if (sprite == null) { displayFallback = GetDisplayNameFromControlPath(controlPath); return false; } var spriteName = sprite.name; tag = $""; return true; } public bool TryGetUISpriteForActionPath(string controlPath, InputDeviceWatcher.InputDeviceCategory device, out Sprite sprite) { sprite = null; if (string.IsNullOrEmpty(controlPath) || database == null) return false; var entry = database.FindEntryByControlPath(controlPath, device); if (entry == null) { entry = database.FindEntryByControlPath(controlPath, InputDeviceWatcher.InputDeviceCategory.Keyboard); } if (entry == null) return false; if (entry.Sprite == null) return false; sprite = entry.Sprite; return true; } string GetDisplayNameFromControlPath(string controlPath) { if (string.IsNullOrEmpty(controlPath)) return string.Empty; var parts = controlPath.Split('/'); var last = parts[parts.Length - 1].Trim(new char[] { '{', '}', '<', '>', '\'', '"' }); return last; } }