#if ENABLE_INPUT_SYSTEM using Google.Protobuf.WellKnownTypes; using NUnit.Framework.Internal; using System.Collections.Generic; using UnityEditor.Experimental.GraphView; using UnityEngine; using UnityEngine.InputSystem; namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem { /// 基于UnityInputSystem实现的输入解决器 public class InputSystemResolver : InputResolver { DualWayDictionary m_devices = new DualWayDictionary(); protected override void OnInit() { foreach (var device in InputSystem.devices) AddDevice(device); InputSystem.onDeviceChange += IP_onDeviceChange; } private void AddDevice(InputDevice ipdev) { InputDevice_D newDevice = null; if (ipdev is Keyboard) newDevice = new Keyboard_D(this); else if (ipdev is Gamepad) newDevice = new GamePad_D(this); if (newDevice != null) { m_devices.Add(ipdev, newDevice); AddDeviceMapper(newDevice, ipdev); RaiseDeviceConnected(newDevice); } } private void RemoveDevice(InputDevice ipdev) { if (m_devices.TryGetValue(ipdev, out var device)) { m_devices.Remove(ipdev); RemoveDeviceMapper(device); RaiseDeviceLost(device); } } private T GetInputSystemDevice(InputDevice_D device) where T : InputDevice { m_devices.TryGetKey(device, out var ipDev); return ipDev as T; } public override string GetDeviceName(InputDevice_D inputDevice) { var ipdev = GetInputSystemDevice(inputDevice); Debug.Assert(ipdev != null, "不能对已离线的设备获取名称"); return $"{ipdev.description.deviceClass}_{ipdev.description.interfaceName}_{ipdev.deviceId}"; } public override bool CheckOnline(InputDevice_D device) { return m_devices.TryGetKey(device, out var _); } private void IP_onDeviceChange(InputDevice device, InputDeviceChange changeType) { switch (changeType) { case InputDeviceChange.Added: AddDevice(device); break; case InputDeviceChange.Removed: RemoveDevice(device); break; } } public override IEnumerable GetDevices() { return m_devices.Values; } public override bool CheckPerforming(CONTROLLER control) { var ipControl = GetInputSystemControl(control); return ipControl.IsPressed(); } public override Vector2 GetVector2(CONTROLLER control) { var ipControl = GetInputSystemControl(control); return (ipControl as InputControl).value; } public override float GetFloat(CONTROLLER control) { var ipControl = GetInputSystemControl(control); return (ipControl as InputControl).value; } InputControl GetInputSystemControl(InputControl_C key) { var device_d = key.Device; var mapper = m_deviceMapper[device_d]; mapper.TryGetValue(key, out InputControl inputBtn); if (inputBtn != null) return inputBtn; else { throw new System.Exception($"not found mapper setting : {key}"); } } Dictionary> m_deviceMapper = new Dictionary>(); void AddDeviceMapper(InputDevice_D device_d, InputDevice ipdevice) { m_deviceMapper.Add(device_d, new Dictionary()); var mapper = m_deviceMapper[device_d]; if (device_d is Keyboard_D keyboard_d) { var ipKeyboard = ipdevice as Keyboard; mapper[keyboard_d.A] = ipKeyboard.aKey; mapper[keyboard_d.B] = ipKeyboard.bKey; mapper[keyboard_d.C] = ipKeyboard.cKey; mapper[keyboard_d.D] = ipKeyboard.dKey; mapper[keyboard_d.E] = ipKeyboard.eKey; mapper[keyboard_d.F] = ipKeyboard.fKey; mapper[keyboard_d.G] = ipKeyboard.gKey; mapper[keyboard_d.H] = ipKeyboard.hKey; mapper[keyboard_d.I] = ipKeyboard.iKey; mapper[keyboard_d.J] = ipKeyboard.jKey; mapper[keyboard_d.K] = ipKeyboard.kKey; mapper[keyboard_d.L] = ipKeyboard.lKey; mapper[keyboard_d.M] = ipKeyboard.mKey; mapper[keyboard_d.N] = ipKeyboard.nKey; mapper[keyboard_d.O] = ipKeyboard.oKey; mapper[keyboard_d.P] = ipKeyboard.pKey; mapper[keyboard_d.Q] = ipKeyboard.qKey; mapper[keyboard_d.R] = ipKeyboard.rKey; mapper[keyboard_d.S] = ipKeyboard.sKey; mapper[keyboard_d.T] = ipKeyboard.tKey; mapper[keyboard_d.U] = ipKeyboard.uKey; mapper[keyboard_d.V] = ipKeyboard.vKey; mapper[keyboard_d.W] = ipKeyboard.wKey; mapper[keyboard_d.X] = ipKeyboard.xKey; mapper[keyboard_d.Y] = ipKeyboard.yKey; mapper[keyboard_d.Z] = ipKeyboard.zKey; mapper[keyboard_d.Alpha0] = ipKeyboard.digit0Key; mapper[keyboard_d.Alpha1] = ipKeyboard.digit1Key; mapper[keyboard_d.Alpha2] = ipKeyboard.digit2Key; mapper[keyboard_d.Alpha3] = ipKeyboard.digit3Key; mapper[keyboard_d.Alpha4] = ipKeyboard.digit4Key; mapper[keyboard_d.Alpha5] = ipKeyboard.digit5Key; mapper[keyboard_d.Alpha6] = ipKeyboard.digit6Key; mapper[keyboard_d.Alpha7] = ipKeyboard.digit7Key; mapper[keyboard_d.Alpha8] = ipKeyboard.digit8Key; mapper[keyboard_d.Alpha9] = ipKeyboard.digit9Key; mapper[keyboard_d.Keypad0] = ipKeyboard.numpad0Key; mapper[keyboard_d.Keypad1] = ipKeyboard.numpad1Key; mapper[keyboard_d.Keypad2] = ipKeyboard.numpad2Key; mapper[keyboard_d.Keypad3] = ipKeyboard.numpad3Key; mapper[keyboard_d.Keypad4] = ipKeyboard.numpad4Key; mapper[keyboard_d.Keypad5] = ipKeyboard.numpad5Key; mapper[keyboard_d.Keypad6] = ipKeyboard.numpad6Key; mapper[keyboard_d.Keypad7] = ipKeyboard.numpad7Key; mapper[keyboard_d.Keypad8] = ipKeyboard.numpad8Key; mapper[keyboard_d.Keypad9] = ipKeyboard.numpad9Key; mapper[keyboard_d.KeypadPeriod] = ipKeyboard.numpadPeriodKey; mapper[keyboard_d.KeypadDivide] = ipKeyboard.numpadDivideKey; mapper[keyboard_d.KeypadMultiply] = ipKeyboard.numpadMultiplyKey; mapper[keyboard_d.KeypadMinus] = ipKeyboard.numpadMinusKey; mapper[keyboard_d.KeypadPlus] = ipKeyboard.numpadPlusKey; mapper[keyboard_d.KeypadEnter] = ipKeyboard.numpadEnterKey; mapper[keyboard_d.F1] = ipKeyboard.f1Key; mapper[keyboard_d.F2] = ipKeyboard.f2Key; mapper[keyboard_d.F3] = ipKeyboard.f3Key; mapper[keyboard_d.F4] = ipKeyboard.f4Key; mapper[keyboard_d.F5] = ipKeyboard.f5Key; mapper[keyboard_d.F6] = ipKeyboard.f6Key; mapper[keyboard_d.F7] = ipKeyboard.f7Key; mapper[keyboard_d.F8] = ipKeyboard.f8Key; mapper[keyboard_d.F9] = ipKeyboard.f9Key; mapper[keyboard_d.F10] = ipKeyboard.f10Key; mapper[keyboard_d.F11] = ipKeyboard.f11Key; mapper[keyboard_d.F12] = ipKeyboard.f12Key; mapper[keyboard_d.UpArrow] = ipKeyboard.upArrowKey; mapper[keyboard_d.DownArrow] = ipKeyboard.downArrowKey; mapper[keyboard_d.LeftArrow] = ipKeyboard.leftArrowKey; mapper[keyboard_d.RightArrow] = ipKeyboard.rightArrowKey; mapper[keyboard_d.Space] = ipKeyboard.spaceKey; mapper[keyboard_d.Backspace] = ipKeyboard.backspaceKey; mapper[keyboard_d.Tab] = ipKeyboard.tabKey; mapper[keyboard_d.Return] = ipKeyboard.enterKey; mapper[keyboard_d.Escape] = ipKeyboard.escapeKey; mapper[keyboard_d.LeftShift] = ipKeyboard.leftShiftKey; mapper[keyboard_d.RightShift] = ipKeyboard.rightShiftKey; mapper[keyboard_d.LeftControl] = ipKeyboard.leftCtrlKey; mapper[keyboard_d.RightControl] = ipKeyboard.rightCtrlKey; mapper[keyboard_d.LeftAlt] = ipKeyboard.leftAltKey; mapper[keyboard_d.RightAlt] = ipKeyboard.rightAltKey; mapper[keyboard_d.LeftCommand] = ipKeyboard.leftCommandKey; mapper[keyboard_d.RightCommand] = ipKeyboard.rightCommandKey; mapper[keyboard_d.CapsLock] = ipKeyboard.capsLockKey; mapper[keyboard_d.Numlock] = ipKeyboard.numLockKey; mapper[keyboard_d.ScrollLock] = ipKeyboard.scrollLockKey; mapper[keyboard_d.Print] = ipKeyboard.printScreenKey; mapper[keyboard_d.Pause] = ipKeyboard.pauseKey; mapper[keyboard_d.Insert] = ipKeyboard.insertKey; mapper[keyboard_d.Home] = ipKeyboard.homeKey; mapper[keyboard_d.End] = ipKeyboard.endKey; mapper[keyboard_d.PageUp] = ipKeyboard.pageUpKey; mapper[keyboard_d.PageDown] = ipKeyboard.pageDownKey; mapper[keyboard_d.Delete] = ipKeyboard.deleteKey; mapper[keyboard_d.Comma] = ipKeyboard.commaKey; mapper[keyboard_d.Period] = ipKeyboard.periodKey; mapper[keyboard_d.Slash] = ipKeyboard.slashKey; mapper[keyboard_d.BackQuote] = ipKeyboard.backquoteKey; mapper[keyboard_d.Minus] = ipKeyboard.minusKey; mapper[keyboard_d.Equals_k] = ipKeyboard.equalsKey; mapper[keyboard_d.LeftBracket] = ipKeyboard.leftBracketKey; mapper[keyboard_d.RightBracket] = ipKeyboard.rightBracketKey; mapper[keyboard_d.Backslash] = ipKeyboard.backslashKey; mapper[keyboard_d.Semicolon] = ipKeyboard.semicolonKey; mapper[keyboard_d.Quote] = ipKeyboard.quoteKey; } else if (device_d is GamePad_D gamepad_d) { var ipGamepad = ipdevice as Gamepad; mapper[gamepad_d.Up] = ipGamepad.dpad.up; mapper[gamepad_d.Down] = ipGamepad.dpad.down; mapper[gamepad_d.Left] = ipGamepad.dpad.left; mapper[gamepad_d.Right] = ipGamepad.dpad.right; mapper[gamepad_d.Select] = ipGamepad.selectButton; mapper[gamepad_d.Start] = ipGamepad.startButton; mapper[gamepad_d.North] = ipGamepad.buttonNorth; mapper[gamepad_d.South] = ipGamepad.buttonSouth; mapper[gamepad_d.West] = ipGamepad.buttonWest; mapper[gamepad_d.East] = ipGamepad.buttonEast; mapper[gamepad_d.LeftShoulder] = ipGamepad.leftShoulder; mapper[gamepad_d.RightShoulder] = ipGamepad.rightShoulder; mapper[gamepad_d.LeftTrigger] = ipGamepad.leftTrigger; mapper[gamepad_d.RightTrigger] = ipGamepad.rightTrigger; mapper[gamepad_d.LeftStickPress] = ipGamepad.leftStickButton; mapper[gamepad_d.RightStickPress] = ipGamepad.rightStickButton; mapper[gamepad_d.LeftStick] = ipGamepad.leftStick; mapper[gamepad_d.RightStick] = ipGamepad.rightStick; } else throw new System.NotImplementedException($"初始化设备失败,未实现的物理按键映射 for {device_d.GetType()}"); } void RemoveDeviceMapper(InputDevice_D keyboard_d) { m_deviceMapper.Remove(keyboard_d); } } } #endif