diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/Model/EmuCoreBinder.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/Model/EmuCoreBinder.cs index 4fc1538e..85053a77 100644 --- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/Model/EmuCoreBinder.cs +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/Model/EmuCoreBinder.cs @@ -3,6 +3,7 @@ using AxibugEmuOnline.Client.InputDevices; using AxibugEmuOnline.Client.Settings; using System; using System.Collections.Generic; +using System.Linq; using UnityEngine; /// <summary> @@ -19,7 +20,7 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder, where T : Enum { //每一个实例代表一个对应模拟器平台的控制器索引 - List<ControllerBinder> m_bindingPages = new List<ControllerBinder>(); + List<ControllerBinder> m_controllerBinders = new List<ControllerBinder>(); public EmuCoreBinder() { @@ -27,13 +28,15 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder, for (int i = 0; i < ControllerCount; i++) { - m_bindingPages.Add(new ControllerBinder(i, this)); + m_controllerBinders.Add(new ControllerBinder(i, this)); } foreach (var device in App.input.GetDevices()) { - foreach (var binding in m_bindingPages) + foreach (var binding in m_controllerBinders) { + if (device.Exclusive && GetRegistedBinder(device) != null) continue; + binding.RegistInputDevice(device); } } @@ -42,9 +45,23 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder, App.input.OnDeviceConnected += InputDevicesMgr_OnDeviceConnected; } + /// <summary> 获取指定设备的注册Binder对象 </summary> + /// <param name="device"></param> + /// <returns>返回首个匹配对象</returns> + public ControllerBinder GetRegistedBinder(InputDevice_D device) + { + foreach (var binding in m_controllerBinders) + { + if (device.Exclusive && GetRegistedBinder(device) != null) continue; + if (binding.IsRegisted(device)) return binding; + } + + return null; + } + private void InputDevicesMgr_OnDeviceConnected(InputDevice_D connectDevice) { - foreach (var binding in m_bindingPages) + foreach (var binding in m_controllerBinders) { binding.RegistInputDevice(connectDevice); } @@ -52,7 +69,7 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder, private void InputDevicesMgr_OnDeviceLost(InputDevice_D lostDevice) { - foreach (var binding in m_bindingPages) + foreach (var binding in m_controllerBinders) { binding.UnregistInputDevice(lostDevice); } @@ -71,7 +88,7 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder, public bool Start(T emuControl, int controllerIndex) { - var binding = m_bindingPages[controllerIndex]; + var binding = m_controllerBinders[controllerIndex]; foreach (var key in binding.GetBinding(emuControl)) { if (key.Start) return true; @@ -82,7 +99,7 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder, public bool Release(T emuControl, int controllerIndex) { - var binding = m_bindingPages[controllerIndex]; + var binding = m_controllerBinders[controllerIndex]; foreach (var key in binding.GetBinding(emuControl)) { if (key.Release) return true; @@ -100,7 +117,7 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder, /// <returns></returns> public bool GetKey(T emuControl, int controllerIndex) { - var binding = m_bindingPages[controllerIndex]; + var binding = m_controllerBinders[controllerIndex]; foreach (var key in binding.GetBinding(emuControl)) { if (key.Performing) return true; @@ -116,7 +133,7 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder, /// <returns></returns> public bool AnyKeyDown(int controllerIndex) { - var binding = m_bindingPages[controllerIndex]; + var binding = m_controllerBinders[controllerIndex]; return binding.AnyKeyDown(); } @@ -130,7 +147,7 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder, /// <returns></returns> public Vector2 GetVector2(T emuControl, int controllerIndex) { - var binding = m_bindingPages[controllerIndex]; + var binding = m_controllerBinders[controllerIndex]; foreach (var control in binding.GetBinding(emuControl)) { if (!control.Performing) continue; @@ -155,7 +172,7 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder, var totalFloat = 0f; var totalControl = 0; - var binding = m_bindingPages[controllerIndex]; + var binding = m_controllerBinders[controllerIndex]; foreach (var key in binding.GetBinding(emuControl)) { if (!key.Performing) continue; @@ -193,6 +210,10 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder, { return m_registedDevices.ContainsKey(deviceType); } + internal bool IsRegisted(InputDevice_D device) + { + return m_registedDevices.Values.Contains(device); + } internal void RegistInputDevice(InputDevice_D device) { diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputDevice_D.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputDevice_D.cs index b7d82bea..d6b0fe8c 100644 --- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputDevice_D.cs +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputDevice_D.cs @@ -6,6 +6,8 @@ namespace AxibugEmuOnline.Client.InputDevices { public abstract class InputDevice_D { + /// <summary> 指示该设备是否只能由一个Binder独占 </summary> + public virtual bool Exclusive => true; public string UniqueName => m_resolver.GetDeviceName(this); /// <summary> 指示该设备是否在线 </summary> diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/Keyboard_D.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/Keyboard_D.cs index 35a28897..841a8072 100644 --- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/Keyboard_D.cs +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/Keyboard_D.cs @@ -112,5 +112,6 @@ namespace AxibugEmuOnline.Client.InputDevices public Button_C ScrollLock; public Keyboard_D(InputResolver resolver) : base(resolver) { } + public override bool Exclusive => false; } } \ No newline at end of file