From 8bd3b2247b1c697cf051a9f93839ccd3828915c2 Mon Sep 17 00:00:00 2001
From: "ALIENJACK\\alien" <alienjack@foxmail.com>
Date: Wed, 9 Apr 2025 14:54:21 +0800
Subject: [PATCH] =?UTF-8?q?=E8=BE=93=E5=87=BA=E6=A8=A1=E5=9D=97=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0=E7=8B=AC=E5=8D=A0=E6=9C=BA=E5=88=B6,=E9=81=BF?=
=?UTF-8?q?=E5=85=8D=E4=B8=80=E4=B8=AA=E8=AE=BE=E5=A4=87=E7=BB=91=E5=AE=9A?=
=?UTF-8?q?=E5=88=B0=E5=A4=9A=E4=B8=AA=E6=89=8B=E6=9F=84=E6=98=A0=E5=B0=84?=
=?UTF-8?q?=E9=85=8D=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../KeyMapperSetting/Model/EmuCoreBinder.cs | 43 ++++++++++++++-----
.../Devices/InputDevice_D.cs | 2 +
.../InputDevicesManager/Devices/Keyboard_D.cs | 1 +
3 files changed, 35 insertions(+), 11 deletions(-)
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