AxibugEmuOnline/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputSystemResolver.cs

230 lines
10 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#if ENABLE_INPUT_SYSTEM
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem.Controls;
using IP = UnityEngine.InputSystem.InputSystem;
using IPDevice = UnityEngine.InputSystem.InputDevice;
using IPKeyboard = UnityEngine.InputSystem.Keyboard;
namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem
{
/// <summary> 基于UnityInputSystem实现的输入解决器 </summary>
public class InputSystemResolver : InputResolver
{
DualWayDictionary<IPDevice, InputDevice> m_devices = new DualWayDictionary<IPDevice, InputDevice>();
protected override void OnInit()
{
foreach (var device in IP.devices) AddDevice(device);
IP.onDeviceChange += IP_onDeviceChange;
}
private void AddDevice(IPDevice ipdev)
{
InputDevice newDevice = null;
if (ipdev is IPKeyboard) newDevice = new KeyBoard(this);
if (newDevice != null)
{
m_devices.Add(ipdev, newDevice);
RaiseDeviceConnected(newDevice);
}
}
private void RemoveDevice(IPDevice ipdev)
{
if (m_devices.TryGetValue(ipdev, out var device))
{
m_devices.Remove(ipdev);
RaiseDeviceLost(device);
}
}
public override string GetDeviceName(InputDevice inputDevice)
{
m_devices.TryGetKey(inputDevice, out var ipdev);
Debug.Assert(ipdev != null, "不能对已离线的设备获取名称");
return $"{ipdev.description.deviceClass}_{ipdev.description.interfaceName}_{ipdev.deviceId}";
}
public override bool CheckOnline(InputDevice device)
{
return m_devices.TryGetKey(device, out var _);
}
private void IP_onDeviceChange(IPDevice device, UnityEngine.InputSystem.InputDeviceChange changeType)
{
switch (changeType)
{
case UnityEngine.InputSystem.InputDeviceChange.Added: AddDevice(device); break;
case UnityEngine.InputSystem.InputDeviceChange.Removed: RemoveDevice(device); break;
}
}
public override IEnumerable<InputDevice> GetDevices()
{
return m_devices.Values;
}
public override bool CheckPerforming<CONTROLLER>(CONTROLLER control)
{
if (control.Device is KeyBoard keyboard)
{
if (control is KeyBoard.KeyboardKey key)
{
if (m_devices.TryGetKey(keyboard, out var ipdev))
{
var ipKeyboard = ipdev as IPKeyboard;
if (ipKeyboard == null) return false;
var k = GetIPKeyboardKey(ipKeyboard, key.m_keycode);
return k.isPressed;
}
return false;
}
}
throw new System.NotImplementedException();
}
public override Vector2 GetVector2<CONTROLLER>(CONTROLLER control)
{
throw new System.NotImplementedException();
}
public override float GetFloat<CONTROLLER>(CONTROLLER control)
{
throw new System.NotImplementedException();
}
static ButtonControl GetIPKeyboardKey(IPKeyboard keyboard, KeyCode key)
{
switch (key)
{
// 字母键A-Z
case KeyCode.A: return keyboard.aKey;
case KeyCode.B: return keyboard.bKey;
case KeyCode.C: return keyboard.cKey;
case KeyCode.D: return keyboard.dKey;
case KeyCode.E: return keyboard.eKey;
case KeyCode.F: return keyboard.fKey;
case KeyCode.G: return keyboard.gKey;
case KeyCode.H: return keyboard.hKey;
case KeyCode.I: return keyboard.iKey;
case KeyCode.J: return keyboard.jKey;
case KeyCode.K: return keyboard.kKey;
case KeyCode.L: return keyboard.lKey;
case KeyCode.M: return keyboard.mKey;
case KeyCode.N: return keyboard.nKey;
case KeyCode.O: return keyboard.oKey;
case KeyCode.P: return keyboard.pKey;
case KeyCode.Q: return keyboard.qKey;
case KeyCode.R: return keyboard.rKey;
case KeyCode.S: return keyboard.sKey;
case KeyCode.T: return keyboard.tKey;
case KeyCode.U: return keyboard.uKey;
case KeyCode.V: return keyboard.vKey;
case KeyCode.W: return keyboard.wKey;
case KeyCode.X: return keyboard.xKey;
case KeyCode.Y: return keyboard.yKey;
case KeyCode.Z: return keyboard.zKey;
// 数字键0-9
case KeyCode.Alpha0: return keyboard.digit0Key;
case KeyCode.Alpha1: return keyboard.digit1Key;
case KeyCode.Alpha2: return keyboard.digit2Key;
case KeyCode.Alpha3: return keyboard.digit3Key;
case KeyCode.Alpha4: return keyboard.digit4Key;
case KeyCode.Alpha5: return keyboard.digit5Key;
case KeyCode.Alpha6: return keyboard.digit6Key;
case KeyCode.Alpha7: return keyboard.digit7Key;
case KeyCode.Alpha8: return keyboard.digit8Key;
case KeyCode.Alpha9: return keyboard.digit9Key;
// 小键盘
case KeyCode.Keypad0: return keyboard.numpad0Key;
case KeyCode.Keypad1: return keyboard.numpad1Key;
case KeyCode.Keypad2: return keyboard.numpad2Key;
case KeyCode.Keypad3: return keyboard.numpad3Key;
case KeyCode.Keypad4: return keyboard.numpad4Key;
case KeyCode.Keypad5: return keyboard.numpad5Key;
case KeyCode.Keypad6: return keyboard.numpad6Key;
case KeyCode.Keypad7: return keyboard.numpad7Key;
case KeyCode.Keypad8: return keyboard.numpad8Key;
case KeyCode.Keypad9: return keyboard.numpad9Key;
case KeyCode.KeypadPeriod: return keyboard.numpadPeriodKey;
case KeyCode.KeypadDivide: return keyboard.numpadDivideKey;
case KeyCode.KeypadMultiply: return keyboard.numpadMultiplyKey;
case KeyCode.KeypadMinus: return keyboard.numpadMinusKey;
case KeyCode.KeypadPlus: return keyboard.numpadPlusKey;
case KeyCode.KeypadEnter: return keyboard.numpadEnterKey;
case KeyCode.KeypadEquals: return keyboard.numpadEqualsKey;
// 功能键F1-F15
case KeyCode.F1: return keyboard.f1Key;
case KeyCode.F2: return keyboard.f2Key;
case KeyCode.F3: return keyboard.f3Key;
case KeyCode.F4: return keyboard.f4Key;
case KeyCode.F5: return keyboard.f5Key;
case KeyCode.F6: return keyboard.f6Key;
case KeyCode.F7: return keyboard.f7Key;
case KeyCode.F8: return keyboard.f8Key;
case KeyCode.F9: return keyboard.f9Key;
case KeyCode.F10: return keyboard.f10Key;
case KeyCode.F11: return keyboard.f11Key;
case KeyCode.F12: return keyboard.f12Key;
// 方向键
case KeyCode.UpArrow: return keyboard.upArrowKey;
case KeyCode.DownArrow: return keyboard.downArrowKey;
case KeyCode.LeftArrow: return keyboard.leftArrowKey;
case KeyCode.RightArrow: return keyboard.rightArrowKey;
// 符号键
case KeyCode.Space: return keyboard.spaceKey;
case KeyCode.Backspace: return keyboard.backspaceKey;
case KeyCode.Tab: return keyboard.tabKey;
case KeyCode.Return: return keyboard.enterKey;
case KeyCode.Escape: return keyboard.escapeKey;
case KeyCode.LeftShift: return keyboard.leftShiftKey;
case KeyCode.RightShift: return keyboard.rightShiftKey;
case KeyCode.LeftControl: return keyboard.leftCtrlKey;
case KeyCode.RightControl: return keyboard.rightCtrlKey;
case KeyCode.LeftAlt: return keyboard.leftAltKey;
case KeyCode.RightAlt: return keyboard.rightAltKey;
case KeyCode.LeftCommand: return keyboard.leftCommandKey; // macOS Command键
case KeyCode.RightCommand: return keyboard.rightCommandKey;
case KeyCode.CapsLock: return keyboard.capsLockKey;
case KeyCode.Numlock: return keyboard.numLockKey;
case KeyCode.ScrollLock: return keyboard.scrollLockKey;
case KeyCode.Print: return keyboard.printScreenKey;
case KeyCode.Pause: return keyboard.pauseKey;
case KeyCode.Insert: return keyboard.insertKey;
case KeyCode.Home: return keyboard.homeKey;
case KeyCode.End: return keyboard.endKey;
case KeyCode.PageUp: return keyboard.pageUpKey;
case KeyCode.PageDown: return keyboard.pageDownKey;
case KeyCode.Delete: return keyboard.deleteKey;
case KeyCode.Comma: return keyboard.commaKey;
case KeyCode.Period: return keyboard.periodKey;
case KeyCode.Slash: return keyboard.slashKey;
case KeyCode.BackQuote: return keyboard.backquoteKey;
case KeyCode.Minus: return keyboard.minusKey;
case KeyCode.Equals: return keyboard.equalsKey;
case KeyCode.LeftBracket: return keyboard.leftBracketKey;
case KeyCode.RightBracket: return keyboard.rightBracketKey;
case KeyCode.Backslash: return keyboard.backslashKey;
case KeyCode.Semicolon: return keyboard.semicolonKey;
case KeyCode.Quote: return keyboard.quoteKey;
default:
throw new System.NotImplementedException($"Not Find KeyCode Mapper Code from {key}");
}
}
}
}
#endif