using System.Collections; using System.Collections.Generic; using BITKit; using UnityEngine; using UnityEngine.InputSystem; namespace Project.B.Player { public class ScriptablePlayerKeyMap : ScriptableObject, IPlayerKeyMap, IUXKeyMap,ICarKeyMap { [RuntimeInitializeOnLoadMethod] private static void Reload() { CachedKeyDictionary.Clear(); } private static readonly Dictionary CachedKeyDictionary = new(); [Header(nameof(IPlayerKeyMap))] [SerializeField] private InputActionReference movementAction; [SerializeField] private InputActionReference viewAction; [SerializeField] private InputActionReference jumpAction; [SerializeField] private InputActionReference runAction; [SerializeField] private InputActionReference crouchAction; [SerializeField] private InputActionReference toggleCameraAction; [SerializeField] private InputActionReference interactAction; [SerializeField] private InputActionReference holsterAction; [SerializeField] private InputActionReference primaryAction; [SerializeField] private InputActionReference secondaryAction; [SerializeField] private InputActionReference sidearmAction; [SerializeField] private InputActionReference suppliesAction; [SerializeField] private InputActionReference tacticAction; [SerializeField] private InputActionReference lethalAction; [SerializeField] private InputActionReference killStreakAction; [SerializeField] private InputActionReference scrollAction; [SerializeField] private InputActionReference meleeAction; [SerializeField] private InputActionReference reloadAction; [SerializeField] private InputActionReference aimAction; [SerializeField] private InputActionReference fireAction; [SerializeField] private InputActionReference inspectAction; [SerializeField] private InputActionReference markAction; [Header(nameof(IUXKeyMap))] [SerializeField] private InputActionReference cancelAction; [SerializeField] private InputActionReference inventoryAction; [SerializeField] private InputActionReference confirmAction; [SerializeField] private InputActionReference chatAction; [Header(nameof(ICarKeyMap))] [SerializeField] private InputActionReference verticalAction; [SerializeField] private InputActionReference horizontalAction; [SerializeField] private InputActionReference handBrakeAction; public IReadOnlyDictionary KeyDictionary { get { if (CachedKeyDictionary.Count is not 0) return CachedKeyDictionary; foreach (var fieldInfo in GetType().GetFields(ReflectionHelper.Flags)) { if (fieldInfo.FieldType != typeof(InputActionReference)) continue; if (fieldInfo.GetValue(this) is null) continue; var inputActionReference = (InputActionReference)fieldInfo.GetValue(this); if (CachedKeyDictionary.TryAdd(inputActionReference.GetKeyMap(), inputActionReference) is false) { Debug.LogWarning("重复的Key:" + inputActionReference.GetKeyMap()); } } return CachedKeyDictionary; } } public InputAction MovementKey =>movementAction; public InputAction ViewKey =>viewAction; public InputAction JumpKey =>jumpAction; public InputAction RunKey =>runAction; public InputAction CrouchKey =>crouchAction; public InputAction ToggleCameraKey =>toggleCameraAction; public InputAction InteractiveKey =>interactAction; public InputAction HolsterKey =>holsterAction; public InputAction PrimaryWeaponKey =>primaryAction; public InputAction SecondaryWeaponKey =>secondaryAction; public InputAction SidearmKey =>sidearmAction; public InputAction SuppliesKey =>suppliesAction; public InputAction TacticalKey =>tacticAction; public InputAction LethalKey =>lethalAction; public InputAction KillStreakKey =>killStreakAction; public InputAction ScrollKey =>scrollAction; public InputAction MeleeKey =>meleeAction; public InputAction ReloadKey =>reloadAction; public InputAction AimKey =>aimAction; public InputAction FireKey =>fireAction; public InputAction InspectKey => inspectAction; public InputAction MarkKey => markAction; public InputAction CancelKey =>cancelAction; public InputAction InventoryKey =>inventoryAction; public InputAction ConfirmKey =>confirmAction; public InputAction ChatKey => chatAction; public InputAction VerticalKey => verticalAction; public InputAction HorizontalKey => horizontalAction; public InputAction HandBrakeKey => handBrakeAction; } }