输出模块增加独占机制,避免一个设备绑定到多个手柄映射配置

This commit is contained in:
ALIENJACK\alien 2025-04-09 14:54:21 +08:00
parent c89b6b1ab5
commit 8bd3b2247b
3 changed files with 35 additions and 11 deletions
AxibugEmuOnline.Client/Assets/Script/AppMain/Manager
AppSettings/KeyMapperSetting/Model
InputDevicesManager/Devices

View File

@ -3,6 +3,7 @@ using AxibugEmuOnline.Client.InputDevices;
using AxibugEmuOnline.Client.Settings; using AxibugEmuOnline.Client.Settings;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using UnityEngine; using UnityEngine;
/// <summary> /// <summary>
@ -19,7 +20,7 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder,
where T : Enum where T : Enum
{ {
//每一个实例代表一个对应模拟器平台的控制器索引 //每一个实例代表一个对应模拟器平台的控制器索引
List<ControllerBinder> m_bindingPages = new List<ControllerBinder>(); List<ControllerBinder> m_controllerBinders = new List<ControllerBinder>();
public EmuCoreBinder() public EmuCoreBinder()
{ {
@ -27,13 +28,15 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder,
for (int i = 0; i < ControllerCount; i++) 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 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); binding.RegistInputDevice(device);
} }
} }
@ -42,9 +45,23 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder,
App.input.OnDeviceConnected += InputDevicesMgr_OnDeviceConnected; 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) private void InputDevicesMgr_OnDeviceConnected(InputDevice_D connectDevice)
{ {
foreach (var binding in m_bindingPages) foreach (var binding in m_controllerBinders)
{ {
binding.RegistInputDevice(connectDevice); binding.RegistInputDevice(connectDevice);
} }
@ -52,7 +69,7 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder,
private void InputDevicesMgr_OnDeviceLost(InputDevice_D lostDevice) private void InputDevicesMgr_OnDeviceLost(InputDevice_D lostDevice)
{ {
foreach (var binding in m_bindingPages) foreach (var binding in m_controllerBinders)
{ {
binding.UnregistInputDevice(lostDevice); binding.UnregistInputDevice(lostDevice);
} }
@ -71,7 +88,7 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder,
public bool Start(T emuControl, int controllerIndex) public bool Start(T emuControl, int controllerIndex)
{ {
var binding = m_bindingPages[controllerIndex]; var binding = m_controllerBinders[controllerIndex];
foreach (var key in binding.GetBinding(emuControl)) foreach (var key in binding.GetBinding(emuControl))
{ {
if (key.Start) return true; if (key.Start) return true;
@ -82,7 +99,7 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder,
public bool Release(T emuControl, int controllerIndex) public bool Release(T emuControl, int controllerIndex)
{ {
var binding = m_bindingPages[controllerIndex]; var binding = m_controllerBinders[controllerIndex];
foreach (var key in binding.GetBinding(emuControl)) foreach (var key in binding.GetBinding(emuControl))
{ {
if (key.Release) return true; if (key.Release) return true;
@ -100,7 +117,7 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder,
/// <returns></returns> /// <returns></returns>
public bool GetKey(T emuControl, int controllerIndex) public bool GetKey(T emuControl, int controllerIndex)
{ {
var binding = m_bindingPages[controllerIndex]; var binding = m_controllerBinders[controllerIndex];
foreach (var key in binding.GetBinding(emuControl)) foreach (var key in binding.GetBinding(emuControl))
{ {
if (key.Performing) return true; if (key.Performing) return true;
@ -116,7 +133,7 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder,
/// <returns></returns> /// <returns></returns>
public bool AnyKeyDown(int controllerIndex) public bool AnyKeyDown(int controllerIndex)
{ {
var binding = m_bindingPages[controllerIndex]; var binding = m_controllerBinders[controllerIndex];
return binding.AnyKeyDown(); return binding.AnyKeyDown();
} }
@ -130,7 +147,7 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder,
/// <returns></returns> /// <returns></returns>
public Vector2 GetVector2(T emuControl, int controllerIndex) public Vector2 GetVector2(T emuControl, int controllerIndex)
{ {
var binding = m_bindingPages[controllerIndex]; var binding = m_controllerBinders[controllerIndex];
foreach (var control in binding.GetBinding(emuControl)) foreach (var control in binding.GetBinding(emuControl))
{ {
if (!control.Performing) continue; if (!control.Performing) continue;
@ -155,7 +172,7 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder,
var totalFloat = 0f; var totalFloat = 0f;
var totalControl = 0; var totalControl = 0;
var binding = m_bindingPages[controllerIndex]; var binding = m_controllerBinders[controllerIndex];
foreach (var key in binding.GetBinding(emuControl)) foreach (var key in binding.GetBinding(emuControl))
{ {
if (!key.Performing) continue; if (!key.Performing) continue;
@ -193,6 +210,10 @@ public abstract class EmuCoreBinder<T> : InternalEmuCoreBinder,
{ {
return m_registedDevices.ContainsKey(deviceType); return m_registedDevices.ContainsKey(deviceType);
} }
internal bool IsRegisted(InputDevice_D device)
{
return m_registedDevices.Values.Contains(device);
}
internal void RegistInputDevice(InputDevice_D device) internal void RegistInputDevice(InputDevice_D device)
{ {

View File

@ -6,6 +6,8 @@ namespace AxibugEmuOnline.Client.InputDevices
{ {
public abstract class InputDevice_D public abstract class InputDevice_D
{ {
/// <summary> 指示该设备是否只能由一个Binder独占 </summary>
public virtual bool Exclusive => true;
public string UniqueName => m_resolver.GetDeviceName(this); public string UniqueName => m_resolver.GetDeviceName(this);
/// <summary> 指示该设备是否在线 </summary> /// <summary> 指示该设备是否在线 </summary>

View File

@ -112,5 +112,6 @@ namespace AxibugEmuOnline.Client.InputDevices
public Button_C ScrollLock; public Button_C ScrollLock;
public Keyboard_D(InputResolver resolver) : base(resolver) { } public Keyboard_D(InputResolver resolver) : base(resolver) { }
public override bool Exclusive => false;
} }
} }