优化多平台设备绑定组件
This commit is contained in:
parent
f4ec668bfd
commit
5e256faf03
@ -138,6 +138,12 @@ public static class GlyphService
|
|||||||
return string.Empty;
|
return string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string humanReadable = InputControlPath.ToHumanReadableString(controlPath, InputControlPath.HumanReadableStringOptions.OmitDevice);
|
||||||
|
if (!string.IsNullOrWhiteSpace(humanReadable))
|
||||||
|
{
|
||||||
|
return humanReadable;
|
||||||
|
}
|
||||||
|
|
||||||
string[] parts = controlPath.Split('/');
|
string[] parts = controlPath.Split('/');
|
||||||
string last = parts[parts.Length - 1].Trim(TrimChars);
|
string last = parts[parts.Length - 1].Trim(TrimChars);
|
||||||
return last;
|
return last;
|
||||||
|
|||||||
@ -7,20 +7,20 @@ public abstract class InputGlyphBehaviourBase : MonoBehaviour
|
|||||||
protected virtual void OnEnable()
|
protected virtual void OnEnable()
|
||||||
{
|
{
|
||||||
CurrentCategory = InputDeviceWatcher.CurrentCategory;
|
CurrentCategory = InputDeviceWatcher.CurrentCategory;
|
||||||
InputDeviceWatcher.OnDeviceContextChanged += HandleDeviceContextChanged;
|
InputDeviceWatcher.OnDeviceChanged += HandleDeviceChanged;
|
||||||
InputBindingManager.BindingsChanged += HandleBindingsChanged;
|
InputBindingManager.BindingsChanged += HandleBindingsChanged;
|
||||||
RefreshGlyph();
|
RefreshGlyph();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void OnDisable()
|
protected virtual void OnDisable()
|
||||||
{
|
{
|
||||||
InputDeviceWatcher.OnDeviceContextChanged -= HandleDeviceContextChanged;
|
InputDeviceWatcher.OnDeviceChanged -= HandleDeviceChanged;
|
||||||
InputBindingManager.BindingsChanged -= HandleBindingsChanged;
|
InputBindingManager.BindingsChanged -= HandleBindingsChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleDeviceContextChanged(InputDeviceWatcher.DeviceContext context)
|
private void HandleDeviceChanged(InputDeviceWatcher.InputDeviceCategory category)
|
||||||
{
|
{
|
||||||
CurrentCategory = context.Category;
|
CurrentCategory = category;
|
||||||
RefreshGlyph();
|
RefreshGlyph();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -231,9 +231,65 @@ public sealed class InputGlyphDatabase : ScriptableObject
|
|||||||
|
|
||||||
private static string NormalizeControlPath(string controlPath)
|
private static string NormalizeControlPath(string controlPath)
|
||||||
{
|
{
|
||||||
return string.IsNullOrWhiteSpace(controlPath)
|
if (string.IsNullOrWhiteSpace(controlPath))
|
||||||
? string.Empty
|
{
|
||||||
: controlPath.Trim().ToLowerInvariant();
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CanonicalizeDeviceLayout(controlPath.Trim().ToLowerInvariant());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string CanonicalizeDeviceLayout(string controlPath)
|
||||||
|
{
|
||||||
|
int start = controlPath.IndexOf('<');
|
||||||
|
int end = controlPath.IndexOf('>');
|
||||||
|
if (start < 0 || end <= start + 1)
|
||||||
|
{
|
||||||
|
return controlPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
string layout = controlPath.Substring(start + 1, end - start - 1);
|
||||||
|
string canonicalLayout = GetCanonicalLayout(layout);
|
||||||
|
if (string.Equals(layout, canonicalLayout, StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
return controlPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
return controlPath.Substring(0, start + 1) + canonicalLayout + controlPath.Substring(end);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetCanonicalLayout(string layout)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(layout))
|
||||||
|
{
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (layout.IndexOf("keyboard", StringComparison.OrdinalIgnoreCase) >= 0)
|
||||||
|
{
|
||||||
|
return "keyboard";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (layout.IndexOf("mouse", StringComparison.OrdinalIgnoreCase) >= 0)
|
||||||
|
{
|
||||||
|
return "mouse";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (layout.IndexOf("joystick", StringComparison.OrdinalIgnoreCase) >= 0)
|
||||||
|
{
|
||||||
|
return "joystick";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (layout.IndexOf("gamepad", StringComparison.OrdinalIgnoreCase) >= 0
|
||||||
|
|| layout.IndexOf("controller", StringComparison.OrdinalIgnoreCase) >= 0
|
||||||
|
|| layout.IndexOf("xinput", StringComparison.OrdinalIgnoreCase) >= 0
|
||||||
|
|| layout.IndexOf("dualshock", StringComparison.OrdinalIgnoreCase) >= 0
|
||||||
|
|| layout.IndexOf("dualsense", StringComparison.OrdinalIgnoreCase) >= 0)
|
||||||
|
{
|
||||||
|
return "gamepad";
|
||||||
|
}
|
||||||
|
|
||||||
|
return layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static InputDeviceWatcher.InputDeviceCategory ParseCategory(string deviceName)
|
private static InputDeviceWatcher.InputDeviceCategory ParseCategory(string deviceName)
|
||||||
|
|||||||
@ -7,6 +7,7 @@ using UnityEngine.InputSystem;
|
|||||||
public sealed class InputGlyphText : InputGlyphBehaviourBase
|
public sealed class InputGlyphText : InputGlyphBehaviourBase
|
||||||
{
|
{
|
||||||
[SerializeField] private InputActionReference actionReference;
|
[SerializeField] private InputActionReference actionReference;
|
||||||
|
[SerializeField] private string compositePartName;
|
||||||
|
|
||||||
private TMP_Text _textField;
|
private TMP_Text _textField;
|
||||||
private string _templateText;
|
private string _templateText;
|
||||||
@ -35,7 +36,7 @@ public sealed class InputGlyphText : InputGlyphBehaviourBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
string formattedText;
|
string formattedText;
|
||||||
if (GlyphService.TryGetTMPTagForActionPath(actionReference, string.Empty, CurrentCategory, out string tag, out string displayFallback))
|
if (GlyphService.TryGetTMPTagForActionPath(actionReference, compositePartName, CurrentCategory, out string tag, out string displayFallback))
|
||||||
{
|
{
|
||||||
formattedText = Utility.Text.Format(_templateText, tag);
|
formattedText = Utility.Text.Format(_templateText, tag);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,6 +6,7 @@ using UnityEngine.UI;
|
|||||||
public sealed class InputGlyphUXButton : InputGlyphBehaviourBase
|
public sealed class InputGlyphUXButton : InputGlyphBehaviourBase
|
||||||
{
|
{
|
||||||
[SerializeField] private UXButton button;
|
[SerializeField] private UXButton button;
|
||||||
|
[SerializeField] private string compositePartName;
|
||||||
[SerializeField] private Image targetImage;
|
[SerializeField] private Image targetImage;
|
||||||
|
|
||||||
private Sprite _cachedSprite;
|
private Sprite _cachedSprite;
|
||||||
@ -49,7 +50,7 @@ public sealed class InputGlyphUXButton : InputGlyphBehaviourBase
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasSprite = GlyphService.TryGetUISpriteForActionPath(actionReference, string.Empty, CurrentCategory, out Sprite sprite);
|
bool hasSprite = GlyphService.TryGetUISpriteForActionPath(actionReference, compositePartName, CurrentCategory, out Sprite sprite);
|
||||||
if (!hasSprite)
|
if (!hasSprite)
|
||||||
{
|
{
|
||||||
sprite = null;
|
sprite = null;
|
||||||
|
|||||||
@ -27,7 +27,7 @@ public class TestRebindScript : MonoBehaviour
|
|||||||
private void Start()
|
private void Start()
|
||||||
{
|
{
|
||||||
if (btn != null) btn.onClick.AddListener(OnBtnClicked);
|
if (btn != null) btn.onClick.AddListener(OnBtnClicked);
|
||||||
InputDeviceWatcher.OnDeviceContextChanged += OnDeviceContextChanged;
|
InputDeviceWatcher.OnDeviceChanged += OnDeviceChanged;
|
||||||
InputBindingManager.BindingsChanged += OnBindingsChanged;
|
InputBindingManager.BindingsChanged += OnBindingsChanged;
|
||||||
UpdateBindingText();
|
UpdateBindingText();
|
||||||
|
|
||||||
@ -47,7 +47,7 @@ public class TestRebindScript : MonoBehaviour
|
|||||||
private void OnDisable()
|
private void OnDisable()
|
||||||
{
|
{
|
||||||
if (btn != null) btn.onClick.RemoveListener(OnBtnClicked);
|
if (btn != null) btn.onClick.RemoveListener(OnBtnClicked);
|
||||||
InputDeviceWatcher.OnDeviceContextChanged -= OnDeviceContextChanged;
|
InputDeviceWatcher.OnDeviceChanged -= OnDeviceChanged;
|
||||||
InputBindingManager.BindingsChanged -= OnBindingsChanged;
|
InputBindingManager.BindingsChanged -= OnBindingsChanged;
|
||||||
|
|
||||||
if (InputBindingManager.Instance != null)
|
if (InputBindingManager.Instance != null)
|
||||||
@ -117,7 +117,7 @@ public class TestRebindScript : MonoBehaviour
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 设备变更的回调
|
/// 设备变更的回调
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void OnDeviceContextChanged(InputDeviceWatcher.DeviceContext _)
|
private void OnDeviceChanged(InputDeviceWatcher.InputDeviceCategory _)
|
||||||
{
|
{
|
||||||
UpdateBindingText();
|
UpdateBindingText();
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user