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

255 lines
12 KiB
C#

#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
{
/// <summary> 基于UnityInputSystem实现的输入解决器 </summary>
public class InputSystemResolver : InputResolver
{
DualWayDictionary<InputDevice, InputDevice_D> m_devices = new DualWayDictionary<InputDevice, InputDevice_D>();
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<T>(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>(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<InputDevice_D> GetDevices()
{
return m_devices.Values;
}
public override bool CheckPerforming<CONTROLLER>(CONTROLLER control)
{
var ipControl = GetInputSystemControl(control);
return ipControl.IsPressed();
}
public override Vector2 GetVector2<CONTROLLER>(CONTROLLER control)
{
var ipControl = GetInputSystemControl(control);
return (ipControl as InputControl<Vector2>).value;
}
public override float GetFloat<CONTROLLER>(CONTROLLER control)
{
var ipControl = GetInputSystemControl(control);
return (ipControl as InputControl<float>).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<InputDevice_D, Dictionary<InputControl_C, InputControl>> m_deviceMapper = new Dictionary<InputDevice_D, Dictionary<InputControl_C, InputControl>>();
void AddDeviceMapper(InputDevice_D device_d, InputDevice ipdevice)
{
m_deviceMapper.Add(device_d, new Dictionary<InputControl_C, InputControl>());
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