Input逻辑结构调整

This commit is contained in:
ALIENJACK\alien 2025-03-27 19:19:05 +08:00
parent 50e3a30f31
commit e463c23c4c
11 changed files with 358 additions and 443 deletions

View File

@ -232,7 +232,7 @@ namespace AxibugEmuOnline.Client.Settings
else return totalFloat / totalControl;
}
public class MapSetting : Dictionary<T, List<InputControl_D>> { }
public class MapSetting : Dictionary<T, List<InputControl_C>> { }
public class BindingPage
{
@ -277,7 +277,7 @@ namespace AxibugEmuOnline.Client.Settings
m_mapSetting.Remove(device);
}
public void SetBinding(T emuBtn, InputControl_D key, int settingSlot)
public void SetBinding(T emuBtn, InputControl_C key, int settingSlot)
{
var device = key.Device;
m_registedDevices.TryGetValue(device.GetType(), out var inputDevice);
@ -287,7 +287,7 @@ namespace AxibugEmuOnline.Client.Settings
var setting = m_mapSetting[inputDevice];
if (!setting.TryGetValue(emuBtn, out var settingList))
{
settingList = new List<InputControl_D>();
settingList = new List<InputControl_C>();
setting[emuBtn] = settingList;
}
@ -297,7 +297,7 @@ namespace AxibugEmuOnline.Client.Settings
settingList[settingSlot] = key;
}
public InputControl_D GetBinding(T emuBtn, InputDevice_D device, int settingSlot)
public InputControl_C GetBinding(T emuBtn, InputDevice_D device, int settingSlot)
{
m_mapSetting.TryGetValue(device, out var mapSetting);
if (mapSetting == null) return null;
@ -308,8 +308,8 @@ namespace AxibugEmuOnline.Client.Settings
return settingList[settingSlot];
}
private List<InputControl_D> m_caches = new List<InputControl_D>();
public IEnumerable<InputControl_D> GetBinding(T emuBtn)
private List<InputControl_C> m_caches = new List<InputControl_C>();
public IEnumerable<InputControl_C> GetBinding(T emuBtn)
{
m_caches.Clear();

View File

@ -1,34 +1,29 @@
using System.Collections.Generic;
namespace AxibugEmuOnline.Client.InputDevices
namespace AxibugEmuOnline.Client.InputDevices
{
/// <summary>
/// 通用游戏控制器
/// </summary>
public class GamePad_D : InputDevice_D
{
public Button_C Up { get; private set; }
public Button_C Down { get; private set; }
public Button_C Left { get; private set; }
public Button_C Right { get; private set; }
public Button_C Option { get; private set; }
public Button_C Start { get; private set; }
public Button_C North { get; private set; }
public Button_C South { get; private set; }
public Button_C West { get; private set; }
public Button_C East { get; private set; }
public Button_C LeftShoulder { get; private set; }
public Button_C RightShoulder { get; private set; }
public Button_C LeftTrigger { get; private set; }
public Button_C RightTrigger { get; private set; }
public Button_C Up;
public Button_C Down;
public Button_C Left;
public Button_C Right;
public Button_C Option;
public Button_C Start;
public Button_C North;
public Button_C South;
public Button_C West;
public Button_C East;
public Button_C LeftShoulder;
public Button_C RightShoulder;
public Button_C LeftTrigger;
public Button_C RightTrigger;
public Button_C LeftStickPress;
public Button_C RightStickPress;
public Stick_C LeftStick;
public Stick_C RightStick;
public GamePad_D(InputResolver resolver) : base(resolver) { }
protected override List<InputControl_D> DefineControls()
{
throw new System.NotImplementedException();
}
}
}

View File

@ -3,15 +3,10 @@
/// <summary>
/// 按键类型的输入控件
/// </summary>
public class Button_C : InputControl_D
public class Button_C : InputControl_C
{
string m_controlName;
public Button_C(InputDevice_D device, string controlName) : base(device)
public Button_C(InputDevice_D device, string controlName) : base(device, controlName)
{
m_controlName = controlName;
}
public override string ControlName => m_controlName;
}
}

View File

@ -1,11 +1,14 @@
using UnityEngine;
using System;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
namespace AxibugEmuOnline.Client.InputDevices
{
/// <summary>
/// 输入设备的抽象控件接口
/// </summary>
public abstract class InputControl_D
public abstract class InputControl_C
{
/// <summary> 控件所属设备 </summary>
public InputDevice_D Device { get; internal set; }
@ -30,7 +33,6 @@ namespace AxibugEmuOnline.Client.InputDevices
UpdateReleaseStartState();
OnUpdate();
}
private void UpdateReleaseStartState()
{
var oldPerforming = m_performingLastFrame;
@ -48,12 +50,42 @@ namespace AxibugEmuOnline.Client.InputDevices
protected virtual void OnUpdate() { }
public InputControl_C Parent { get; private set; }
/// <summary> 控件名,这个控件名称必须是唯一的 </summary>
public abstract string ControlName { get; }
internal InputControl_D(InputDevice_D device)
public string ControlName { get; private set; }
protected Dictionary<string, InputControl_C> m_controlMapper = new Dictionary<string, InputControl_C>();
internal InputControl_C(InputDevice_D device, string controlName)
{
Device = device;
ControlName = controlName;
DefineControls();
}
private void DefineControls()
{
foreach (var field in GetType().GetFields(BindingFlags.Instance | BindingFlags.Public))
{
if (!typeof(InputControl_C).IsAssignableFrom(field.FieldType)) continue;
var controlIns = Activator.CreateInstance(field.FieldType, this, field.Name) as InputControl_C;
controlIns.Parent = this;
field.SetValue(this, controlIns);
m_controlMapper[field.Name] = controlIns;
}
}
public override string ToString()
{
if (Parent != null)
{
return $"{Parent}/{ControlName}";
}
else
{
return $"{Device}/{ControlName}";
}
}
}
}

View File

@ -5,24 +5,15 @@ namespace AxibugEmuOnline.Client.InputDevices
/// <summary>
/// 摇杆类型的输入控件,支持的返回值为Vector2
/// </summary>
public class Stick_C : InputControl_D
public class Stick_C : InputControl_C
{
string m_controlName;
public override string ControlName => m_controlName;
public VirtualButton UP;
public VirtualButton Down;
public VirtualButton Left;
public VirtualButton Right;
public VirtualButton UP { get; private set; }
public VirtualButton Down { get; private set; }
public VirtualButton Left { get; private set; }
public VirtualButton Right { get; private set; }
public Stick_C(InputDevice_D device, string controlName) : base(device)
public Stick_C(InputDevice_D device, string controlName) : base(device, controlName)
{
m_controlName = controlName;
UP = new VirtualButton(device);
Down = new VirtualButton(device);
Left = new VirtualButton(device);
Right = new VirtualButton(device);
}
protected override void OnUpdate()
@ -43,11 +34,11 @@ namespace AxibugEmuOnline.Client.InputDevices
}
public class VirtualButton : InputControl_D
public class VirtualButton : InputControl_C
{
internal bool m_performing;
public VirtualButton(InputDevice_D device) : base(device) { }
public VirtualButton(InputDevice_D device, string controlName) : base(device, controlName) { }
public override bool Performing
{
@ -63,8 +54,6 @@ namespace AxibugEmuOnline.Client.InputDevices
{
return Performing ? 1 : 0;
}
public override string ControlName => "VirtualStickButton";
}
}
}

View File

@ -1,4 +1,6 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Reflection;
namespace AxibugEmuOnline.Client.InputDevices
{
@ -13,15 +15,24 @@ namespace AxibugEmuOnline.Client.InputDevices
/// <summary> 获得输入解决器 </summary>
internal InputResolver Resolver => m_resolver;
protected Dictionary<string, InputControl_D> m_controlMapper = new Dictionary<string, InputControl_D>();
protected Dictionary<string, InputControl_C> m_controlMapper = new Dictionary<string, InputControl_C>();
protected InputResolver m_resolver;
public InputDevice_D(InputResolver resolver)
{
m_resolver = resolver;
DefineControls();
}
foreach (var control in DefineControls())
private void DefineControls()
{
foreach (var field in GetType().GetFields(BindingFlags.Instance | BindingFlags.Public))
{
m_controlMapper.Add(control.ControlName, control);
if (!typeof(InputControl_C).IsAssignableFrom(field.FieldType)) continue;
var controlIns = Activator.CreateInstance(field.FieldType, this, field.Name) as InputControl_C;
field.SetValue(this, controlIns);
m_controlMapper[field.Name] = controlIns;
}
}
@ -39,18 +50,9 @@ namespace AxibugEmuOnline.Client.InputDevices
}
}
/// <summary> 用于列出这个输入设备的所有输入控件实例 </summary>
/// <returns></returns>
protected abstract List<InputControl_D> DefineControls();
/// <summary> 通过控件名称,找到对应的控件 </summary>
/// <param name="keyName"></param>
/// <returns></returns>
public InputControl_D FindControlByName(string controlName)
public override string ToString()
{
m_controlMapper.TryGetValue(controlName, out var key);
return key;
return Resolver.GetDeviceName(this);
}
}
}

View File

@ -1,190 +1,116 @@
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace AxibugEmuOnline.Client.InputDevices
{
/// <summary>
/// 通用键盘设备
/// </summary>
public partial class Keyboard_D : InputDevice_D
public class Keyboard_D : InputDevice_D
{
Dictionary<KeyCode, KeyboardKey> m_keyControllerMap = new Dictionary<KeyCode, KeyboardKey>();
public Button_C A;
public Button_C B;
public Button_C C;
public Button_C D;
public Button_C E;
public Button_C F;
public Button_C G;
public Button_C H;
public Button_C I;
public Button_C J;
public Button_C K;
public Button_C L;
public Button_C M;
public Button_C N;
public Button_C O;
public Button_C P;
public Button_C Q;
public Button_C R;
public Button_C S;
public Button_C T;
public Button_C U;
public Button_C V;
public Button_C W;
public Button_C X;
public Button_C Y;
public Button_C Z;
public Button_C Alpha0;
public Button_C Alpha1;
public Button_C Alpha2;
public Button_C Alpha3;
public Button_C Alpha4;
public Button_C Alpha5;
public Button_C Alpha6;
public Button_C Alpha7;
public Button_C Alpha8;
public Button_C Alpha9;
public Button_C F1;
public Button_C F2;
public Button_C F3;
public Button_C F4;
public Button_C F5;
public Button_C F6;
public Button_C F7;
public Button_C F8;
public Button_C F9;
public Button_C F10;
public Button_C F11;
public Button_C F12;
public Button_C UpArrow;
public Button_C DownArrow;
public Button_C LeftArrow;
public Button_C RightArrow;
public Button_C Space;
public Button_C Return;
public Button_C Escape;
public Button_C Tab;
public Button_C Backspace;
public Button_C CapsLock;
public Button_C LeftShift;
public Button_C RightShift;
public Button_C LeftControl;
public Button_C RightControl;
public Button_C LeftAlt;
public Button_C RightAlt;
public Button_C LeftCommand;
public Button_C RightCommand;
public Button_C Comma;
public Button_C Period;
public Button_C Slash;
public Button_C BackQuote;
public Button_C Quote;
public Button_C Semicolon;
public Button_C LeftBracket;
public Button_C RightBracket;
public Button_C Backslash;
public Button_C Minus;
public Button_C Equals_k;
public Button_C Keypad0;
public Button_C Keypad1;
public Button_C Keypad2;
public Button_C Keypad3;
public Button_C Keypad4;
public Button_C Keypad5;
public Button_C Keypad6;
public Button_C Keypad7;
public Button_C Keypad8;
public Button_C Keypad9;
public Button_C KeypadPeriod;
public Button_C KeypadDivide;
public Button_C KeypadMultiply;
public Button_C KeypadMinus;
public Button_C KeypadPlus;
public Button_C KeypadEnter;
public Button_C Numlock;
public Button_C Print;
public Button_C Insert;
public Button_C Delete;
public Button_C Home;
public Button_C End;
public Button_C PageUp;
public Button_C PageDown;
public Button_C Pause;
public Button_C ScrollLock;
public Keyboard_D(InputResolver resolver) : base(resolver) { }
protected override List<InputControl_D> DefineControls()
{
var keys = s_keyboardKeys.Select(kc => new KeyboardKey(kc, this) as InputControl_D).ToList();
foreach (KeyboardKey key in keys)
{
m_keyControllerMap.Add(key.m_keycode, key);
}
return keys;
}
public class KeyboardKey : Button_C
{
internal KeyCode m_keycode;
internal KeyboardKey(KeyCode listenKey, Keyboard_D keyboard)
: base(keyboard, listenKey.ToString())
{
m_keycode = listenKey;
}
}
}
#region HardCodeForKeyboard
public partial class Keyboard_D : InputDevice_D
{
static readonly List<KeyCode> s_keyboardKeys = new List<KeyCode>
{
// 字母键 A-Z
KeyCode.A, KeyCode.B, KeyCode.C, KeyCode.D, KeyCode.E, KeyCode.F, KeyCode.G,
KeyCode.H, KeyCode.I, KeyCode.J, KeyCode.K, KeyCode.L, KeyCode.M, KeyCode.N,
KeyCode.O, KeyCode.P, KeyCode.Q, KeyCode.R, KeyCode.S, KeyCode.T, KeyCode.U,
KeyCode.V, KeyCode.W, KeyCode.X, KeyCode.Y, KeyCode.Z,
// 数字键 0-9
KeyCode.Alpha0, KeyCode.Alpha1, KeyCode.Alpha2, KeyCode.Alpha3, KeyCode.Alpha4,
KeyCode.Alpha5, KeyCode.Alpha6, KeyCode.Alpha7, KeyCode.Alpha8, KeyCode.Alpha9,
// 功能键 F1-F15
KeyCode.F1, KeyCode.F2, KeyCode.F3, KeyCode.F4, KeyCode.F5, KeyCode.F6,
KeyCode.F7, KeyCode.F8, KeyCode.F9, KeyCode.F10, KeyCode.F11, KeyCode.F12,
// 方向键
KeyCode.UpArrow, KeyCode.DownArrow, KeyCode.LeftArrow, KeyCode.RightArrow,
// 控制键
KeyCode.Space, KeyCode.Return, KeyCode.Escape, KeyCode.Tab, KeyCode.Backspace,
KeyCode.CapsLock, KeyCode.LeftShift, KeyCode.RightShift, KeyCode.LeftControl,
KeyCode.RightControl, KeyCode.LeftAlt, KeyCode.RightAlt, KeyCode.LeftCommand,
KeyCode.RightCommand,
// 符号键
KeyCode.Comma, KeyCode.Period, KeyCode.Slash, KeyCode.BackQuote, KeyCode.Quote,
KeyCode.Semicolon, KeyCode.LeftBracket, KeyCode.RightBracket, KeyCode.Backslash,
KeyCode.Minus, KeyCode.Equals,
// 小键盘
KeyCode.Keypad0, KeyCode.Keypad1, KeyCode.Keypad2, KeyCode.Keypad3, KeyCode.Keypad4,
KeyCode.Keypad5, KeyCode.Keypad6, KeyCode.Keypad7, KeyCode.Keypad8, KeyCode.Keypad9,
KeyCode.KeypadPeriod, KeyCode.KeypadDivide, KeyCode.KeypadMultiply,
KeyCode.KeypadMinus, KeyCode.KeypadPlus, KeyCode.KeypadEnter, KeyCode.Numlock,
// 其他标准键
KeyCode.Print, KeyCode.Insert, KeyCode.Delete, KeyCode.Home,
KeyCode.End, KeyCode.PageUp, KeyCode.PageDown, KeyCode.Pause, KeyCode.ScrollLock,
};
public KeyboardKey A => m_keyControllerMap[KeyCode.A];
public KeyboardKey B => m_keyControllerMap[KeyCode.B];
public KeyboardKey C => m_keyControllerMap[KeyCode.C];
public KeyboardKey D => m_keyControllerMap[KeyCode.D];
public KeyboardKey E => m_keyControllerMap[KeyCode.E];
public KeyboardKey F => m_keyControllerMap[KeyCode.F];
public KeyboardKey G => m_keyControllerMap[KeyCode.G];
public KeyboardKey H => m_keyControllerMap[KeyCode.H];
public KeyboardKey I => m_keyControllerMap[KeyCode.I];
public KeyboardKey J => m_keyControllerMap[KeyCode.J];
public KeyboardKey K => m_keyControllerMap[KeyCode.K];
public KeyboardKey L => m_keyControllerMap[KeyCode.L];
public KeyboardKey M => m_keyControllerMap[KeyCode.M];
public KeyboardKey N => m_keyControllerMap[KeyCode.N];
public KeyboardKey O => m_keyControllerMap[KeyCode.O];
public KeyboardKey P => m_keyControllerMap[KeyCode.P];
public KeyboardKey Q => m_keyControllerMap[KeyCode.Q];
public KeyboardKey R => m_keyControllerMap[KeyCode.R];
public KeyboardKey S => m_keyControllerMap[KeyCode.S];
public KeyboardKey T => m_keyControllerMap[KeyCode.T];
public KeyboardKey U => m_keyControllerMap[KeyCode.U];
public KeyboardKey V => m_keyControllerMap[KeyCode.V];
public KeyboardKey W => m_keyControllerMap[KeyCode.W];
public KeyboardKey X => m_keyControllerMap[KeyCode.X];
public KeyboardKey Y => m_keyControllerMap[KeyCode.Y];
public KeyboardKey Z => m_keyControllerMap[KeyCode.Z];
public KeyboardKey Alpha0 => m_keyControllerMap[KeyCode.Alpha0];
public KeyboardKey Alpha1 => m_keyControllerMap[KeyCode.Alpha1];
public KeyboardKey Alpha2 => m_keyControllerMap[KeyCode.Alpha2];
public KeyboardKey Alpha3 => m_keyControllerMap[KeyCode.Alpha3];
public KeyboardKey Alpha4 => m_keyControllerMap[KeyCode.Alpha4];
public KeyboardKey Alpha5 => m_keyControllerMap[KeyCode.Alpha5];
public KeyboardKey Alpha6 => m_keyControllerMap[KeyCode.Alpha6];
public KeyboardKey Alpha7 => m_keyControllerMap[KeyCode.Alpha7];
public KeyboardKey Alpha8 => m_keyControllerMap[KeyCode.Alpha8];
public KeyboardKey Alpha9 => m_keyControllerMap[KeyCode.Alpha9];
public KeyboardKey F1 => m_keyControllerMap[KeyCode.F1];
public KeyboardKey F2 => m_keyControllerMap[KeyCode.F2];
public KeyboardKey F3 => m_keyControllerMap[KeyCode.F3];
public KeyboardKey F4 => m_keyControllerMap[KeyCode.F4];
public KeyboardKey F5 => m_keyControllerMap[KeyCode.F5];
public KeyboardKey F6 => m_keyControllerMap[KeyCode.F6];
public KeyboardKey F7 => m_keyControllerMap[KeyCode.F7];
public KeyboardKey F8 => m_keyControllerMap[KeyCode.F8];
public KeyboardKey F9 => m_keyControllerMap[KeyCode.F9];
public KeyboardKey F10 => m_keyControllerMap[KeyCode.F10];
public KeyboardKey F11 => m_keyControllerMap[KeyCode.F11];
public KeyboardKey F12 => m_keyControllerMap[KeyCode.F12];
public KeyboardKey F13 => m_keyControllerMap[KeyCode.F13];
public KeyboardKey F14 => m_keyControllerMap[KeyCode.F14];
public KeyboardKey F15 => m_keyControllerMap[KeyCode.F15];
public KeyboardKey UpArrow => m_keyControllerMap[KeyCode.UpArrow];
public KeyboardKey DownArrow => m_keyControllerMap[KeyCode.DownArrow];
public KeyboardKey LeftArrow => m_keyControllerMap[KeyCode.LeftArrow];
public KeyboardKey RightArrow => m_keyControllerMap[KeyCode.RightArrow];
public KeyboardKey Space => m_keyControllerMap[KeyCode.Space];
public KeyboardKey Return => m_keyControllerMap[KeyCode.Return];
public KeyboardKey Escape => m_keyControllerMap[KeyCode.Escape];
public KeyboardKey Tab => m_keyControllerMap[KeyCode.Tab];
public KeyboardKey Backspace => m_keyControllerMap[KeyCode.Backspace];
public KeyboardKey CapsLock => m_keyControllerMap[KeyCode.CapsLock];
public KeyboardKey LeftShift => m_keyControllerMap[KeyCode.LeftShift];
public KeyboardKey RightShift => m_keyControllerMap[KeyCode.RightShift];
public KeyboardKey LeftControl => m_keyControllerMap[KeyCode.LeftControl];
public KeyboardKey RightControl => m_keyControllerMap[KeyCode.RightControl];
public KeyboardKey LeftAlt => m_keyControllerMap[KeyCode.LeftAlt];
public KeyboardKey RightAlt => m_keyControllerMap[KeyCode.RightAlt];
public KeyboardKey LeftCommand => m_keyControllerMap[KeyCode.LeftCommand];
public KeyboardKey RightCommand => m_keyControllerMap[KeyCode.RightCommand];
public KeyboardKey Comma => m_keyControllerMap[KeyCode.Comma];
public KeyboardKey Period => m_keyControllerMap[KeyCode.Period];
public KeyboardKey Slash => m_keyControllerMap[KeyCode.Slash];
public KeyboardKey BackQuote => m_keyControllerMap[KeyCode.BackQuote];
public KeyboardKey Quote => m_keyControllerMap[KeyCode.Quote];
public KeyboardKey Semicolon => m_keyControllerMap[KeyCode.Semicolon];
public KeyboardKey LeftBracket => m_keyControllerMap[KeyCode.LeftBracket];
public KeyboardKey RightBracket => m_keyControllerMap[KeyCode.RightBracket];
public KeyboardKey Backslash => m_keyControllerMap[KeyCode.Backslash];
public KeyboardKey Minus => m_keyControllerMap[KeyCode.Minus];
public KeyboardKey Equals_k => m_keyControllerMap[KeyCode.Equals];
public KeyboardKey Keypad0 => m_keyControllerMap[KeyCode.Keypad0];
public KeyboardKey Keypad1 => m_keyControllerMap[KeyCode.Keypad1];
public KeyboardKey Keypad2 => m_keyControllerMap[KeyCode.Keypad2];
public KeyboardKey Keypad3 => m_keyControllerMap[KeyCode.Keypad3];
public KeyboardKey Keypad4 => m_keyControllerMap[KeyCode.Keypad4];
public KeyboardKey Keypad5 => m_keyControllerMap[KeyCode.Keypad5];
public KeyboardKey Keypad6 => m_keyControllerMap[KeyCode.Keypad6];
public KeyboardKey Keypad7 => m_keyControllerMap[KeyCode.Keypad7];
public KeyboardKey Keypad8 => m_keyControllerMap[KeyCode.Keypad8];
public KeyboardKey Keypad9 => m_keyControllerMap[KeyCode.Keypad9];
public KeyboardKey KeypadPeriod => m_keyControllerMap[KeyCode.KeypadPeriod];
public KeyboardKey KeypadDivide => m_keyControllerMap[KeyCode.KeypadDivide];
public KeyboardKey KeypadMultiply => m_keyControllerMap[KeyCode.KeypadMultiply];
public KeyboardKey KeypadMinus => m_keyControllerMap[KeyCode.KeypadMinus];
public KeyboardKey KeypadPlus => m_keyControllerMap[KeyCode.KeypadPlus];
public KeyboardKey KeypadEnter => m_keyControllerMap[KeyCode.KeypadEnter];
public KeyboardKey Numlock => m_keyControllerMap[KeyCode.Numlock];
public KeyboardKey Print => m_keyControllerMap[KeyCode.Print];
public KeyboardKey Insert => m_keyControllerMap[KeyCode.Insert];
public KeyboardKey Delete => m_keyControllerMap[KeyCode.Delete];
public KeyboardKey Home => m_keyControllerMap[KeyCode.Home];
public KeyboardKey End => m_keyControllerMap[KeyCode.End];
public KeyboardKey PageUp => m_keyControllerMap[KeyCode.PageUp];
public KeyboardKey PageDown => m_keyControllerMap[KeyCode.PageDown];
public KeyboardKey Pause => m_keyControllerMap[KeyCode.Pause];
public KeyboardKey ScrollLock => m_keyControllerMap[KeyCode.ScrollLock];
}
#endregion
}

View File

@ -1,54 +1,22 @@
using System.Collections.Generic;
namespace AxibugEmuOnline.Client.InputDevices
namespace AxibugEmuOnline.Client.InputDevices
{
public class PSVController_D : InputDevice_D
{
/// <summary> × </summary>
public Button_C Cross { get; private set; }
/// <summary> ○ </summary>
public Button_C Circle { get; private set; }
/// <summary> □ </summary>
public Button_C Square { get; private set; }
/// <summary> △ </summary>
public Button_C Triangle { get; private set; }
public Button_C L { get; private set; }
public Button_C R { get; private set; }
public Button_C Select { get; private set; }
public Button_C Start { get; private set; }
public Button_C Up { get; private set; }
public Button_C Right { get; private set; }
public Button_C Down { get; private set; }
public Button_C Left { get; private set; }
public Stick_C LeftStick { get; private set; }
public Stick_C RightStick { get; private set; }
public Button_C Cross;
public Button_C Circle;
public Button_C Square;
public Button_C Triangle;
public Button_C L;
public Button_C R;
public Button_C Select;
public Button_C Start;
public Button_C Up;
public Button_C Right;
public Button_C Down;
public Button_C Left;
public Stick_C LeftStick;
public Stick_C RightStick;
public PSVController_D(InputResolver resolver) : base(resolver) { }
protected override List<InputControl_D> DefineControls()
{
List<InputControl_D> result = new List<InputControl_D>();
Cross = new Button_C(this, "X");
Circle = new Button_C(this, "⭕");
Square = new Button_C(this, "□");
Triangle = new Button_C(this, "△");
L = new Button_C(this, "L");
R = new Button_C(this, "R");
Select = new Button_C(this, "SELECT");
Start = new Button_C(this, "START");
Up = new Button_C(this, "UP");
Right = new Button_C(this, "RIGHT");
Down = new Button_C(this, "DOWN");
Left = new Button_C(this, "LEFT");
LeftStick = new Stick_C(this, nameof(LeftStick));
RightStick = new Stick_C(this, nameof(RightStick));
return result;
}
}
}

View File

@ -56,9 +56,9 @@ namespace AxibugEmuOnline.Client.InputDevices
OnDeviceConnected?.Invoke(connectDevice);
}
public abstract bool CheckPerforming<CONTROLLER>(CONTROLLER control) where CONTROLLER : InputControl_D;
public abstract Vector2 GetVector2<CONTROLLER>(CONTROLLER control) where CONTROLLER : InputControl_D;
public abstract float GetFloat<CONTROLLER>(CONTROLLER control) where CONTROLLER : InputControl_D;
public abstract bool CheckPerforming<CONTROLLER>(CONTROLLER control) where CONTROLLER : InputControl_C;
public abstract Vector2 GetVector2<CONTROLLER>(CONTROLLER control) where CONTROLLER : InputControl_C;
public abstract float GetFloat<CONTROLLER>(CONTROLLER control) where CONTROLLER : InputControl_C;
/// <summary>
/// 获得输入设备的唯一名称
/// </summary>

View File

@ -21,7 +21,13 @@ namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem
private void AddDevice(InputDevice ipdev)
{
InputDevice_D newDevice = null;
if (ipdev is Keyboard) newDevice = new Keyboard_D(this);
if (ipdev is Keyboard)
{
newDevice = new Keyboard_D(this);
AddKeyboardMapper((Keyboard_D)newDevice, (Keyboard)ipdev);
}
else if (ipdev is Gamepad) newDevice = new GamePad_D(this);
if (newDevice != null)
{
m_devices.Add(ipdev, newDevice);
@ -35,12 +41,23 @@ namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem
{
m_devices.Remove(ipdev);
RaiseDeviceLost(device);
if (device is Keyboard_D)
{
RemoveKeyboardMapper((Keyboard_D)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)
{
m_devices.TryGetKey(inputDevice, out var ipdev);
var ipdev = GetInputSystemDevice<InputDevice>(inputDevice);
Debug.Assert(ipdev != null, "不能对已离线的设备获取名称");
return $"{ipdev.description.deviceClass}_{ipdev.description.interfaceName}_{ipdev.deviceId}";
@ -51,12 +68,12 @@ namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem
return m_devices.TryGetKey(device, out var _);
}
private void IP_onDeviceChange(InputDevice device, UnityEngine.InputSystem.InputDeviceChange changeType)
private void IP_onDeviceChange(InputDevice device, InputDeviceChange changeType)
{
switch (changeType)
{
case UnityEngine.InputSystem.InputDeviceChange.Added: AddDevice(device); break;
case UnityEngine.InputSystem.InputDeviceChange.Removed: RemoveDevice(device); break;
case InputDeviceChange.Added: AddDevice(device); break;
case InputDeviceChange.Removed: RemoveDevice(device); break;
}
}
@ -69,22 +86,11 @@ namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem
{
if (control.Device is Keyboard_D keyboard)
{
if (control is Keyboard_D.KeyboardKey key)
{
if (m_devices.TryGetKey(keyboard, out var ipdev))
{
var ipKeyboard = ipdev as Keyboard;
if (ipKeyboard == null) return false;
var k = GetIPKeyboardKey(ipKeyboard, key.m_keycode);
return k.isPressed;
}
return false;
}
var ipKeyboard = GetInputSystemDevice<Keyboard>(keyboard);
var k = GetIPKeyboardKey(ipKeyboard, keyboard, control);
return k.isPressed;
}
throw new System.NotImplementedException();
}
@ -98,130 +104,132 @@ namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem
throw new System.NotImplementedException();
}
static ButtonControl GetIPKeyboardKey(Keyboard keyboard, KeyCode key)
ButtonControl GetIPKeyboardKey(Keyboard ipKeyboard, Keyboard_D keyboard, InputControl_C key)
{
switch (key)
var mapper = m_keyboardMapper[keyboard];
mapper.TryGetValue(key, out ButtonControl inputBtn);
if (inputBtn != null)
return inputBtn;
else
{
// 字母键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}");
throw new System.Exception($"not found keyboard mapper setting : {key}");
}
}
Dictionary<Keyboard_D, Dictionary<InputControl_C, ButtonControl>> m_keyboardMapper = new Dictionary<Keyboard_D, Dictionary<InputControl_C, ButtonControl>>();
void AddKeyboardMapper(Keyboard_D keyboard_d, Keyboard ipkeyboard)
{
m_keyboardMapper.Add(keyboard_d, new Dictionary<InputControl_C, ButtonControl>());
var mapper = m_keyboardMapper[keyboard_d];
mapper.Add(keyboard_d.A, ipkeyboard.aKey);
mapper.Add(keyboard_d.B, ipkeyboard.bKey);
mapper.Add(keyboard_d.C, ipkeyboard.cKey);
mapper.Add(keyboard_d.D, ipkeyboard.dKey);
mapper.Add(keyboard_d.E, ipkeyboard.eKey);
mapper.Add(keyboard_d.F, ipkeyboard.fKey);
mapper.Add(keyboard_d.G, ipkeyboard.gKey);
mapper.Add(keyboard_d.H, ipkeyboard.hKey);
mapper.Add(keyboard_d.I, ipkeyboard.iKey);
mapper.Add(keyboard_d.J, ipkeyboard.jKey);
mapper.Add(keyboard_d.K, ipkeyboard.kKey);
mapper.Add(keyboard_d.L, ipkeyboard.lKey);
mapper.Add(keyboard_d.M, ipkeyboard.mKey);
mapper.Add(keyboard_d.N, ipkeyboard.nKey);
mapper.Add(keyboard_d.O, ipkeyboard.oKey);
mapper.Add(keyboard_d.P, ipkeyboard.pKey);
mapper.Add(keyboard_d.Q, ipkeyboard.qKey);
mapper.Add(keyboard_d.R, ipkeyboard.rKey);
mapper.Add(keyboard_d.S, ipkeyboard.sKey);
mapper.Add(keyboard_d.T, ipkeyboard.tKey);
mapper.Add(keyboard_d.U, ipkeyboard.uKey);
mapper.Add(keyboard_d.V, ipkeyboard.vKey);
mapper.Add(keyboard_d.W, ipkeyboard.wKey);
mapper.Add(keyboard_d.X, ipkeyboard.xKey);
mapper.Add(keyboard_d.Y, ipkeyboard.yKey);
mapper.Add(keyboard_d.Z, ipkeyboard.zKey);
mapper.Add(keyboard_d.Alpha0, ipkeyboard.digit0Key);
mapper.Add(keyboard_d.Alpha1, ipkeyboard.digit1Key);
mapper.Add(keyboard_d.Alpha2, ipkeyboard.digit2Key);
mapper.Add(keyboard_d.Alpha3, ipkeyboard.digit3Key);
mapper.Add(keyboard_d.Alpha4, ipkeyboard.digit4Key);
mapper.Add(keyboard_d.Alpha5, ipkeyboard.digit5Key);
mapper.Add(keyboard_d.Alpha6, ipkeyboard.digit6Key);
mapper.Add(keyboard_d.Alpha7, ipkeyboard.digit7Key);
mapper.Add(keyboard_d.Alpha8, ipkeyboard.digit8Key);
mapper.Add(keyboard_d.Alpha9, ipkeyboard.digit9Key);
mapper.Add(keyboard_d.Keypad0, ipkeyboard.numpad0Key);
mapper.Add(keyboard_d.Keypad1, ipkeyboard.numpad1Key);
mapper.Add(keyboard_d.Keypad2, ipkeyboard.numpad2Key);
mapper.Add(keyboard_d.Keypad3, ipkeyboard.numpad3Key);
mapper.Add(keyboard_d.Keypad4, ipkeyboard.numpad4Key);
mapper.Add(keyboard_d.Keypad5, ipkeyboard.numpad5Key);
mapper.Add(keyboard_d.Keypad6, ipkeyboard.numpad6Key);
mapper.Add(keyboard_d.Keypad7, ipkeyboard.numpad7Key);
mapper.Add(keyboard_d.Keypad8, ipkeyboard.numpad8Key);
mapper.Add(keyboard_d.Keypad9, ipkeyboard.numpad9Key);
mapper.Add(keyboard_d.KeypadPeriod, ipkeyboard.numpadPeriodKey);
mapper.Add(keyboard_d.KeypadDivide, ipkeyboard.numpadDivideKey);
mapper.Add(keyboard_d.KeypadMultiply, ipkeyboard.numpadMultiplyKey);
mapper.Add(keyboard_d.KeypadMinus, ipkeyboard.numpadMinusKey);
mapper.Add(keyboard_d.KeypadPlus, ipkeyboard.numpadPlusKey);
mapper.Add(keyboard_d.KeypadEnter, ipkeyboard.numpadEnterKey);
mapper.Add(keyboard_d.F1, ipkeyboard.f1Key);
mapper.Add(keyboard_d.F2, ipkeyboard.f2Key);
mapper.Add(keyboard_d.F3, ipkeyboard.f3Key);
mapper.Add(keyboard_d.F4, ipkeyboard.f4Key);
mapper.Add(keyboard_d.F5, ipkeyboard.f5Key);
mapper.Add(keyboard_d.F6, ipkeyboard.f6Key);
mapper.Add(keyboard_d.F7, ipkeyboard.f7Key);
mapper.Add(keyboard_d.F8, ipkeyboard.f8Key);
mapper.Add(keyboard_d.F9, ipkeyboard.f9Key);
mapper.Add(keyboard_d.F10, ipkeyboard.f10Key);
mapper.Add(keyboard_d.F11, ipkeyboard.f11Key);
mapper.Add(keyboard_d.F12, ipkeyboard.f12Key);
mapper.Add(keyboard_d.UpArrow, ipkeyboard.upArrowKey);
mapper.Add(keyboard_d.DownArrow, ipkeyboard.downArrowKey);
mapper.Add(keyboard_d.LeftArrow, ipkeyboard.leftArrowKey);
mapper.Add(keyboard_d.RightArrow, ipkeyboard.rightArrowKey);
mapper.Add(keyboard_d.Space, ipkeyboard.spaceKey);
mapper.Add(keyboard_d.Backspace, ipkeyboard.backspaceKey);
mapper.Add(keyboard_d.Tab, ipkeyboard.tabKey);
mapper.Add(keyboard_d.Return, ipkeyboard.enterKey);
mapper.Add(keyboard_d.Escape, ipkeyboard.escapeKey);
mapper.Add(keyboard_d.LeftShift, ipkeyboard.leftShiftKey);
mapper.Add(keyboard_d.RightShift, ipkeyboard.rightShiftKey);
mapper.Add(keyboard_d.LeftControl, ipkeyboard.leftCtrlKey);
mapper.Add(keyboard_d.RightControl, ipkeyboard.rightCtrlKey);
mapper.Add(keyboard_d.LeftAlt, ipkeyboard.leftAltKey);
mapper.Add(keyboard_d.RightAlt, ipkeyboard.rightAltKey);
mapper.Add(keyboard_d.LeftCommand, ipkeyboard.leftCommandKey);
mapper.Add(keyboard_d.RightCommand, ipkeyboard.rightCommandKey);
mapper.Add(keyboard_d.CapsLock, ipkeyboard.capsLockKey);
mapper.Add(keyboard_d.Numlock, ipkeyboard.numLockKey);
mapper.Add(keyboard_d.ScrollLock, ipkeyboard.scrollLockKey);
mapper.Add(keyboard_d.Print, ipkeyboard.printScreenKey);
mapper.Add(keyboard_d.Pause, ipkeyboard.pauseKey);
mapper.Add(keyboard_d.Insert, ipkeyboard.insertKey);
mapper.Add(keyboard_d.Home, ipkeyboard.homeKey);
mapper.Add(keyboard_d.End, ipkeyboard.endKey);
mapper.Add(keyboard_d.PageUp, ipkeyboard.pageUpKey);
mapper.Add(keyboard_d.PageDown, ipkeyboard.pageDownKey);
mapper.Add(keyboard_d.Delete, ipkeyboard.deleteKey);
mapper.Add(keyboard_d.Comma, ipkeyboard.commaKey);
mapper.Add(keyboard_d.Period, ipkeyboard.periodKey);
mapper.Add(keyboard_d.Slash, ipkeyboard.slashKey);
mapper.Add(keyboard_d.BackQuote, ipkeyboard.backquoteKey);
mapper.Add(keyboard_d.Minus, ipkeyboard.minusKey);
mapper.Add(keyboard_d.Equals_k, ipkeyboard.equalsKey);
mapper.Add(keyboard_d.LeftBracket, ipkeyboard.leftBracketKey);
mapper.Add(keyboard_d.RightBracket, ipkeyboard.rightBracketKey);
mapper.Add(keyboard_d.Backslash, ipkeyboard.backslashKey);
mapper.Add(keyboard_d.Semicolon, ipkeyboard.semicolonKey);
mapper.Add(keyboard_d.Quote, ipkeyboard.quoteKey);
}
void RemoveKeyboardMapper(Keyboard_D keyboard_d)
{
m_keyboardMapper.Remove(keyboard_d);
}
}
}
#endif