using System; using System.Collections.Generic; using UnityEngine.InputSystem; namespace SepCore.InputModule.Runtime { public sealed class InputModuleDefaultPromptMap : IInputPromptMap { private readonly InputActionAsset _asset; private readonly Dictionary<(InputActionId, InputDeviceKind), InputPrompt> _entries; public InputModuleDefaultPromptMap(InputActionAsset asset = null) { _asset = asset; _entries = new Dictionary<(InputActionId, InputDeviceKind), InputPrompt>(); PopulateKeyboardMouse(); PopulateGamepad(); PopulateTouch(); } public bool TryGetPrompt(InputActionId actionId, InputDeviceKind deviceKind, out InputPrompt prompt) { if (_asset != null && TryDeriveFromOverride(actionId, deviceKind, out prompt)) { return true; } return _entries.TryGetValue((actionId, deviceKind), out prompt); } private bool TryDeriveFromOverride(InputActionId actionId, InputDeviceKind deviceKind, out InputPrompt prompt) { prompt = InputPrompt.None; InputAction action = _asset.FindAction(actionId.ToString()); if (action == null) { return false; } string devicePrefix = GetDevicePrefix(deviceKind); if (devicePrefix == null) { return false; } for (int i = 0; i < action.bindings.Count; i++) { InputBinding binding = action.bindings[i]; if (binding.isComposite || binding.isPartOfComposite) { continue; } if (binding.overridePath == null) { continue; } string effectivePath = binding.effectivePath; if (effectivePath != null && effectivePath.StartsWith(devicePrefix, StringComparison.OrdinalIgnoreCase)) { string label = InputControlPath.ToHumanReadableString(effectivePath); prompt = new InputPrompt(label); return true; } } return false; } private static string GetDevicePrefix(InputDeviceKind deviceKind) { switch (deviceKind) { case InputDeviceKind.KeyboardMouse: return ""; case InputDeviceKind.Gamepad: return ""; case InputDeviceKind.Touch: return ""; default: return null; } } private void PopulateKeyboardMouse() { Add(InputActionId.Pause, InputDeviceKind.KeyboardMouse, "Esc", "keyboard_esc"); Add(InputActionId.Navigate, InputDeviceKind.KeyboardMouse, "WASD"); Add(InputActionId.Confirm, InputDeviceKind.KeyboardMouse, "Enter", "keyboard_enter"); Add(InputActionId.Cancel, InputDeviceKind.KeyboardMouse, "Esc", "keyboard_esc"); Add(InputActionId.Move, InputDeviceKind.KeyboardMouse, "移动", "keyboard_w|keyboard_a|keyboard_s|keyboard_d"); Add(InputActionId.Sprint, InputDeviceKind.KeyboardMouse, "L Shift", "keyboard_shift"); Add(InputActionId.Interact, InputDeviceKind.KeyboardMouse, "E", "keyboard_e"); } private void PopulateGamepad() { Add(InputActionId.Pause, InputDeviceKind.Gamepad, "Menu", "gamepad_menu"); Add(InputActionId.Navigate, InputDeviceKind.Gamepad, "L Stick", "gamepad_ls"); Add(InputActionId.Confirm, InputDeviceKind.Gamepad, "A", "gamepad_a"); Add(InputActionId.Cancel, InputDeviceKind.Gamepad, "B", "gamepad_b"); Add(InputActionId.Move, InputDeviceKind.Gamepad, "移动", "gamepad_ls"); Add(InputActionId.Sprint, InputDeviceKind.Gamepad, "L3", "gamepad_press_ls"); Add(InputActionId.Interact, InputDeviceKind.Gamepad, "A", "gamepad_a"); } private void PopulateTouch() { Add(InputActionId.Pause, InputDeviceKind.Touch, "Pause"); Add(InputActionId.Navigate, InputDeviceKind.Touch, "Swipe"); Add(InputActionId.Confirm, InputDeviceKind.Touch, "Tap"); Add(InputActionId.Cancel, InputDeviceKind.Touch, "Back"); Add(InputActionId.Move, InputDeviceKind.Touch, "Joystick"); Add(InputActionId.Interact, InputDeviceKind.Touch, "Tap"); } private void Add(InputActionId actionId, InputDeviceKind deviceKind, string textLabel, string spriteName = null) { _entries[(actionId, deviceKind)] = new InputPrompt(textLabel, spriteName); } } }