diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/EssgeeKeyBinding.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/EssgeeKeyBinding.cs
index 9b7d9bdf..df56af03 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/EssgeeKeyBinding.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/EssgeeKeyBinding.cs
@@ -22,57 +22,113 @@ namespace AxibugEmuOnline.Client.Settings
 
     public abstract class EssgeeKeyBinding : EmuCoreControllerKeyBinding<EssgeeSingleKey>
     {
-        protected override void OnRegistDevices(InputDevice_D device, BindingPage binding)
+        public override void Bind(Keyboard_D device, ControllerBinder controller)
         {
-            if (device is Keyboard_D keyboard)
+            switch (controller.ControllerIndex)
             {
-                switch (binding.ControllerIndex)
-                {
-                    case 0:
-                        binding.SetBinding(EssgeeSingleKey.OPTION_1, keyboard.Return, 0);
-                        binding.SetBinding(EssgeeSingleKey.OPTION_2, keyboard.RightShift, 0);
-                        binding.SetBinding(EssgeeSingleKey.UP, keyboard.W, 0);
-                        binding.SetBinding(EssgeeSingleKey.DOWN, keyboard.S, 0);
-                        binding.SetBinding(EssgeeSingleKey.LEFT, keyboard.A, 0);
-                        binding.SetBinding(EssgeeSingleKey.RIGHT, keyboard.D, 0);
-                        binding.SetBinding(EssgeeSingleKey.BTN_1, keyboard.J, 0);
-                        binding.SetBinding(EssgeeSingleKey.BTN_2, keyboard.K, 0);
-                        binding.SetBinding(EssgeeSingleKey.BTN_3, keyboard.U, 0);
-                        binding.SetBinding(EssgeeSingleKey.BTN_4, keyboard.I, 0);
-                        break;
-                    case 1:
-                        binding.SetBinding(EssgeeSingleKey.OPTION_1, keyboard.Keypad0, 0);
-                        binding.SetBinding(EssgeeSingleKey.OPTION_2, keyboard.Delete, 0);
-                        binding.SetBinding(EssgeeSingleKey.UP, keyboard.UpArrow, 0);
-                        binding.SetBinding(EssgeeSingleKey.DOWN, keyboard.DownArrow, 0);
-                        binding.SetBinding(EssgeeSingleKey.LEFT, keyboard.LeftArrow, 0);
-                        binding.SetBinding(EssgeeSingleKey.RIGHT, keyboard.RightArrow, 0);
-                        binding.SetBinding(EssgeeSingleKey.BTN_1, keyboard.Keypad1, 0);
-                        binding.SetBinding(EssgeeSingleKey.BTN_2, keyboard.Keypad2, 0);
-                        binding.SetBinding(EssgeeSingleKey.BTN_3, keyboard.Keypad3, 0);
-                        binding.SetBinding(EssgeeSingleKey.BTN_4, keyboard.Keypad4, 0);
-                        break;
-                }
+                case 0:
+                    controller.SetBinding(EssgeeSingleKey.OPTION_1, device.Return, 0);
+                    controller.SetBinding(EssgeeSingleKey.OPTION_2, device.RightShift, 0);
+                    controller.SetBinding(EssgeeSingleKey.UP, device.W, 0);
+                    controller.SetBinding(EssgeeSingleKey.DOWN, device.S, 0);
+                    controller.SetBinding(EssgeeSingleKey.LEFT, device.A, 0);
+                    controller.SetBinding(EssgeeSingleKey.RIGHT, device.D, 0);
+                    controller.SetBinding(EssgeeSingleKey.BTN_1, device.J, 0);
+                    controller.SetBinding(EssgeeSingleKey.BTN_2, device.K, 0);
+                    controller.SetBinding(EssgeeSingleKey.BTN_3, device.U, 0);
+                    controller.SetBinding(EssgeeSingleKey.BTN_4, device.I, 0);
+                    break;
+                case 1:
+                    controller.SetBinding(EssgeeSingleKey.OPTION_1, device.Keypad0, 0);
+                    controller.SetBinding(EssgeeSingleKey.OPTION_2, device.Delete, 0);
+                    controller.SetBinding(EssgeeSingleKey.UP, device.UpArrow, 0);
+                    controller.SetBinding(EssgeeSingleKey.DOWN, device.DownArrow, 0);
+                    controller.SetBinding(EssgeeSingleKey.LEFT, device.LeftArrow, 0);
+                    controller.SetBinding(EssgeeSingleKey.RIGHT, device.RightArrow, 0);
+                    controller.SetBinding(EssgeeSingleKey.BTN_1, device.Keypad1, 0);
+                    controller.SetBinding(EssgeeSingleKey.BTN_2, device.Keypad2, 0);
+                    controller.SetBinding(EssgeeSingleKey.BTN_3, device.Keypad3, 0);
+                    controller.SetBinding(EssgeeSingleKey.BTN_4, device.Keypad4, 0);
+                    break;
             }
-            else if (device is PSVController_D psvCon && binding.ControllerIndex == 0)
+        }
+        public override void Bind(PSVController_D device, ControllerBinder controller)
+        {
+            switch (controller.ControllerIndex)
             {
-                binding.SetBinding(EssgeeSingleKey.OPTION_1, psvCon.Start, 0);
-                binding.SetBinding(EssgeeSingleKey.OPTION_2, psvCon.Select, 0);
-                binding.SetBinding(EssgeeSingleKey.UP, psvCon.Up, 0);
-                binding.SetBinding(EssgeeSingleKey.DOWN, psvCon.Down, 0);
-                binding.SetBinding(EssgeeSingleKey.LEFT, psvCon.Left, 0);
-                binding.SetBinding(EssgeeSingleKey.RIGHT, psvCon.Right, 0);
-                binding.SetBinding(EssgeeSingleKey.BTN_1, psvCon.Cross, 0);
-                binding.SetBinding(EssgeeSingleKey.BTN_2, psvCon.Circle, 0);
-                binding.SetBinding(EssgeeSingleKey.BTN_3, psvCon.Square, 0);
-                binding.SetBinding(EssgeeSingleKey.BTN_4, psvCon.Triangle, 0);
-                //PSV 摇杆
-                binding.SetBinding(EssgeeSingleKey.UP, psvCon.LeftStick.UP, 1);
-                binding.SetBinding(EssgeeSingleKey.DOWN, psvCon.LeftStick.Down, 1);
-                binding.SetBinding(EssgeeSingleKey.LEFT, psvCon.LeftStick.Left, 1);
-                binding.SetBinding(EssgeeSingleKey.RIGHT, psvCon.LeftStick.Right, 1);
+                case 0:
+                    controller.SetBinding(EssgeeSingleKey.OPTION_1, device.Start, 0);
+                    controller.SetBinding(EssgeeSingleKey.OPTION_2, device.Select, 0);
+                    controller.SetBinding(EssgeeSingleKey.UP, device.Up, 0);
+                    controller.SetBinding(EssgeeSingleKey.DOWN, device.Down, 0);
+                    controller.SetBinding(EssgeeSingleKey.LEFT, device.Left, 0);
+                    controller.SetBinding(EssgeeSingleKey.RIGHT, device.Right, 0);
+                    controller.SetBinding(EssgeeSingleKey.BTN_1, device.Cross, 0);
+                    controller.SetBinding(EssgeeSingleKey.BTN_2, device.Circle, 0);
+                    controller.SetBinding(EssgeeSingleKey.BTN_3, device.Square, 0);
+                    controller.SetBinding(EssgeeSingleKey.BTN_4, device.Triangle, 0);
+
+                    controller.SetBinding(EssgeeSingleKey.UP, device.LeftStick.Up, 1);
+                    controller.SetBinding(EssgeeSingleKey.DOWN, device.LeftStick.Down, 1);
+                    controller.SetBinding(EssgeeSingleKey.LEFT, device.LeftStick.Left, 1);
+                    controller.SetBinding(EssgeeSingleKey.RIGHT, device.LeftStick.Right, 1);
+                    break;
             }
         }
+        public override void Bind(DualShockController_D device, ControllerBinder controller)
+        {
+            controller.SetBinding(EssgeeSingleKey.OPTION_1, device.Options, 0);
+            controller.SetBinding(EssgeeSingleKey.OPTION_2, device.Share, 0);
+            controller.SetBinding(EssgeeSingleKey.UP, device.Up, 0);
+            controller.SetBinding(EssgeeSingleKey.DOWN, device.Down, 0);
+            controller.SetBinding(EssgeeSingleKey.LEFT, device.Left, 0);
+            controller.SetBinding(EssgeeSingleKey.RIGHT, device.Right, 0);
+            controller.SetBinding(EssgeeSingleKey.BTN_1, device.Cross, 0);
+            controller.SetBinding(EssgeeSingleKey.BTN_2, device.Circle, 0);
+            controller.SetBinding(EssgeeSingleKey.BTN_3, device.Square, 0);
+            controller.SetBinding(EssgeeSingleKey.BTN_4, device.Triangle, 0);
+
+            controller.SetBinding(EssgeeSingleKey.UP, device.LeftStick.Up, 1);
+            controller.SetBinding(EssgeeSingleKey.DOWN, device.LeftStick.Down, 1);
+            controller.SetBinding(EssgeeSingleKey.LEFT, device.LeftStick.Left, 1);
+            controller.SetBinding(EssgeeSingleKey.RIGHT, device.LeftStick.Right, 1);
+        }
+        public override void Bind(GamePad_D device, ControllerBinder controller)
+        {
+            controller.SetBinding(EssgeeSingleKey.OPTION_1, device.Start, 0);
+            controller.SetBinding(EssgeeSingleKey.OPTION_2, device.Select, 0);
+            controller.SetBinding(EssgeeSingleKey.UP, device.Up, 0);
+            controller.SetBinding(EssgeeSingleKey.DOWN, device.Down, 0);
+            controller.SetBinding(EssgeeSingleKey.LEFT, device.Left, 0);
+            controller.SetBinding(EssgeeSingleKey.RIGHT, device.Right, 0);
+            controller.SetBinding(EssgeeSingleKey.BTN_1, device.South, 0);
+            controller.SetBinding(EssgeeSingleKey.BTN_2, device.East, 0);
+            controller.SetBinding(EssgeeSingleKey.BTN_3, device.West, 0);
+            controller.SetBinding(EssgeeSingleKey.BTN_4, device.North, 0);
+
+            controller.SetBinding(EssgeeSingleKey.UP, device.LeftStick.Up, 1);
+            controller.SetBinding(EssgeeSingleKey.DOWN, device.LeftStick.Down, 1);
+            controller.SetBinding(EssgeeSingleKey.LEFT, device.LeftStick.Left, 1);
+            controller.SetBinding(EssgeeSingleKey.RIGHT, device.LeftStick.Right, 1);
+        }
+        public override void Bind(XboxController_D device, ControllerBinder controller)
+        {
+            controller.SetBinding(EssgeeSingleKey.OPTION_1, device.Menu, 0);
+            controller.SetBinding(EssgeeSingleKey.OPTION_2, device.View, 0);
+            controller.SetBinding(EssgeeSingleKey.UP, device.Up, 0);
+            controller.SetBinding(EssgeeSingleKey.DOWN, device.Down, 0);
+            controller.SetBinding(EssgeeSingleKey.LEFT, device.Left, 0);
+            controller.SetBinding(EssgeeSingleKey.RIGHT, device.Right, 0);
+            controller.SetBinding(EssgeeSingleKey.BTN_1, device.A, 0);
+            controller.SetBinding(EssgeeSingleKey.BTN_2, device.B, 0);
+            controller.SetBinding(EssgeeSingleKey.BTN_3, device.X, 0);
+            controller.SetBinding(EssgeeSingleKey.BTN_4, device.Y, 0);
+
+            controller.SetBinding(EssgeeSingleKey.UP, device.LeftStick.Up, 1);
+            controller.SetBinding(EssgeeSingleKey.DOWN, device.LeftStick.Down, 1);
+            controller.SetBinding(EssgeeSingleKey.LEFT, device.LeftStick.Left, 1);
+            controller.SetBinding(EssgeeSingleKey.RIGHT, device.LeftStick.Right, 1);
+        }
     }
 
     public class MasterSystemKeyBinding : EssgeeKeyBinding
@@ -97,55 +153,11 @@ namespace AxibugEmuOnline.Client.Settings
     {
         public override RomPlatformType Platform => RomPlatformType.GameBoyColor;
         public override int ControllerCount => 1;
-
-        protected override void OnRegistDevices(InputDevice_D device, BindingPage binding)
-        {
-            if (device is Keyboard_D keyboard)
-            {
-                switch (binding.ControllerIndex)
-                {
-                    case 0:
-                        binding.SetBinding(EssgeeSingleKey.OPTION_1, keyboard.Return, 0);
-                        binding.SetBinding(EssgeeSingleKey.OPTION_2, keyboard.RightShift, 0);
-                        binding.SetBinding(EssgeeSingleKey.UP, keyboard.W, 0);
-                        binding.SetBinding(EssgeeSingleKey.DOWN, keyboard.S, 0);
-                        binding.SetBinding(EssgeeSingleKey.LEFT, keyboard.A, 0);
-                        binding.SetBinding(EssgeeSingleKey.RIGHT, keyboard.D, 0);
-                        binding.SetBinding(EssgeeSingleKey.BTN_1, keyboard.J, 0);
-                        binding.SetBinding(EssgeeSingleKey.BTN_2, keyboard.K, 0);
-                        binding.SetBinding(EssgeeSingleKey.BTN_3, keyboard.U, 0);
-                        binding.SetBinding(EssgeeSingleKey.BTN_4, keyboard.I, 0);
-                        break;
-                }
-            }
-        }
     }
     public class GameBoyKeyBinding : EssgeeKeyBinding
     {
         public override RomPlatformType Platform => RomPlatformType.GameBoy;
         public override int ControllerCount => 1;
-
-        protected override void OnRegistDevices(InputDevice_D device, BindingPage binding)
-        {
-            if (device is Keyboard_D keyboard)
-            {
-                switch (binding.ControllerIndex)
-                {
-                    case 0:
-                        binding.SetBinding(EssgeeSingleKey.OPTION_1, keyboard.Return, 0);
-                        binding.SetBinding(EssgeeSingleKey.OPTION_2, keyboard.RightShift, 0);
-                        binding.SetBinding(EssgeeSingleKey.UP, keyboard.W, 0);
-                        binding.SetBinding(EssgeeSingleKey.DOWN, keyboard.S, 0);
-                        binding.SetBinding(EssgeeSingleKey.LEFT, keyboard.A, 0);
-                        binding.SetBinding(EssgeeSingleKey.RIGHT, keyboard.D, 0);
-                        binding.SetBinding(EssgeeSingleKey.BTN_1, keyboard.J, 0);
-                        binding.SetBinding(EssgeeSingleKey.BTN_2, keyboard.K, 0);
-                        binding.SetBinding(EssgeeSingleKey.BTN_3, keyboard.U, 0);
-                        binding.SetBinding(EssgeeSingleKey.BTN_4, keyboard.I, 0);
-                        break;
-                }
-            }
-        }
     }
 
     public class GameGearKeyBinding : EssgeeKeyBinding
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/IDeviceBinder.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/IDeviceBinder.cs
new file mode 100644
index 00000000..3001ea39
--- /dev/null
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/IDeviceBinder.cs
@@ -0,0 +1,17 @@
+using AxibugEmuOnline.Client.InputDevices;
+using System;
+
+namespace AxibugEmuOnline.Client.Settings
+{
+    /// <summary>
+    /// 在所有<see cref="EmuCoreControllerKeyBinding{T}"/>的派生类中实现此接口以支持一种设备的绑定
+    /// <para>一种<see cref="EmuCoreControllerKeyBinding{T}"/>
+    /// 一个<see cref="EmuCoreControllerKeyBinding{T}.ControllerBinder"/>可以与多种设备建立绑定,但设备类型不可重复</para>
+    /// </summary>
+    public interface IDeviceBinder<ENUM, DEVICE>
+        where ENUM : Enum
+        where DEVICE : InputDevice_D
+    {
+        void Bind(DEVICE device, EmuCoreControllerKeyBinding<ENUM>.ControllerBinder controller);
+    }
+}
\ No newline at end of file
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/IDeviceBinder.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/IDeviceBinder.cs.meta
new file mode 100644
index 00000000..0533689b
--- /dev/null
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/IDeviceBinder.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: b7c859b1adea6a5448ba60e43af3ccc6
\ No newline at end of file
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/KeyMapperSetting.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/KeyMapperSetting.cs
index 27d9e50a..4d63326b 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/KeyMapperSetting.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/KeyMapperSetting.cs
@@ -2,7 +2,6 @@
 using AxibugEmuOnline.Client.InputDevices;
 using AxibugProtobuf;
 using System;
-using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 using UnityEngine;
@@ -58,33 +57,31 @@ namespace AxibugEmuOnline.Client.Settings
     /// 模拟器核心控制器键位绑定器
     /// </summary>
     /// <typeparam name="T"></typeparam>
-    public abstract class EmuCoreControllerKeyBinding<T> : EmuCoreControllerKeyBinding
+    public abstract class EmuCoreControllerKeyBinding<T> : EmuCoreControllerKeyBinding,
+        IDeviceBinder<T, Keyboard_D>,
+        IDeviceBinder<T, GamePad_D>,
+        IDeviceBinder<T, DualShockController_D>,
+        IDeviceBinder<T, XboxController_D>,
+        IDeviceBinder<T, PSVController_D>
         where T : Enum
     {
-        List<BindingPage> m_bindingPages = new List<BindingPage>();
+        //每一个实例代表一个对应模拟器平台的控制器索引
+        List<ControllerBinder> m_bindingPages = new List<ControllerBinder>();
 
         public EmuCoreControllerKeyBinding()
         {
+            var types = GetType().GetInterfaces();
+
             for (int i = 0; i < ControllerCount; i++)
             {
-                m_bindingPages.Add(new BindingPage(i, this));
+                m_bindingPages.Add(new ControllerBinder(i, this));
             }
 
-            var keyboard = App.input.GetDevice<Keyboard_D>();
-            if (keyboard != null)
+            foreach (var device in App.input.GetDevices())
             {
                 foreach (var binding in m_bindingPages)
                 {
-                    binding.RegistInputDevice(keyboard);
-                }
-            }
-
-            var psvController = App.input.GetDevice<PSVController_D>();
-            if (psvController != null)
-            {
-                foreach (var binding in m_bindingPages)
-                {
-                    binding.RegistInputDevice(psvController);
+                    binding.RegistInputDevice(device);
                 }
             }
 
@@ -94,12 +91,9 @@ namespace AxibugEmuOnline.Client.Settings
 
         private void InputDevicesMgr_OnDeviceConnected(InputDevice_D connectDevice)
         {
-            if (connectDevice is Keyboard_D)
+            foreach (var binding in m_bindingPages)
             {
-                foreach (var binding in m_bindingPages)
-                {
-                    binding.RegistInputDevice(connectDevice);
-                }
+                binding.RegistInputDevice(connectDevice);
             }
         }
 
@@ -109,30 +103,18 @@ namespace AxibugEmuOnline.Client.Settings
             {
                 binding.UnregistInputDevice(lostDevice);
             }
-            if (lostDevice is Keyboard_D) //键盘丢失,立即查找还存在的键盘并建立连接
-            {
-                var anotherKeyboard = App.input.GetDevice<Keyboard_D>();
-                if (anotherKeyboard != null)
-                {
-                    foreach (var binding in m_bindingPages)
-                    {
-                        binding.UnregistInputDevice(lostDevice);
-                    }
-                }
-            }
         }
 
-        IEnumerable<T> DefineKeys()
+        internal void RaiseDeviceRegist(InputDevice_D device, ControllerBinder binding)
         {
-            return Enum.GetValues(typeof(T)).Cast<T>();
+            if (device is Keyboard_D keyboard && this is IDeviceBinder<T, Keyboard_D> keyboardIn) keyboardIn.Bind(keyboard, binding);
+            if (device is GamePad_D gamePad && this is IDeviceBinder<T, GamePad_D> gamepadIn) gamepadIn.Bind(gamePad, binding);
+            if (device is DualShockController_D dsC && this is IDeviceBinder<T, DualShockController_D> dsIn) dsIn.Bind(dsC, binding);
+            if (device is XboxController_D xbC && this is IDeviceBinder<T, XboxController_D> xbIn) xbIn.Bind(xbC, binding);
+            if (device is PSVController_D psvC && this is IDeviceBinder<T, PSVController_D> psvIn) psvIn.Bind(psvC, binding);
+            else throw new NotImplementedException($"{device.GetType()}");
         }
 
-        internal void RaiseDeviceRegist(InputDevice_D device, BindingPage binding)
-        {
-            OnRegistDevices(device, binding);
-        }
-        protected abstract void OnRegistDevices(InputDevice_D device, BindingPage binding);
-
         public bool Start(T emuControl, int controllerIndex)
         {
             var binding = m_bindingPages[controllerIndex];
@@ -234,7 +216,7 @@ namespace AxibugEmuOnline.Client.Settings
 
         public class MapSetting : Dictionary<T, List<InputControl_C>> { }
 
-        public class BindingPage
+        public class ControllerBinder
         {
             Dictionary<Type, InputDevice_D> m_registedDevices = new Dictionary<Type, InputDevice_D>();
             Dictionary<InputDevice_D, MapSetting> m_mapSetting = new Dictionary<InputDevice_D, MapSetting>();
@@ -242,7 +224,7 @@ namespace AxibugEmuOnline.Client.Settings
             public int ControllerIndex { get; }
             public EmuCoreControllerKeyBinding<T> Host { get; }
 
-            internal BindingPage(int controllerIndex, EmuCoreControllerKeyBinding<T> host)
+            internal ControllerBinder(int controllerIndex, EmuCoreControllerKeyBinding<T> host)
             {
                 ControllerIndex = controllerIndex;
                 Host = host;
@@ -342,5 +324,10 @@ namespace AxibugEmuOnline.Client.Settings
             }
         }
 
+        public abstract void Bind(Keyboard_D device, ControllerBinder controller);
+        public abstract void Bind(GamePad_D device, ControllerBinder controller);
+        public abstract void Bind(DualShockController_D device, ControllerBinder controller);
+        public abstract void Bind(XboxController_D device, ControllerBinder controller);
+        public abstract void Bind(PSVController_D device, ControllerBinder controller);
     }
 }
\ No newline at end of file
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/MAMEKeyBinding.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/MAMEKeyBinding.cs
index 8631ad58..39a2fe40 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/MAMEKeyBinding.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/MAMEKeyBinding.cs
@@ -1,5 +1,6 @@
 using AxibugEmuOnline.Client.InputDevices;
 using AxibugProtobuf;
+using UnityEngine.UIElements;
 
 namespace AxibugEmuOnline.Client.Settings
 {
@@ -23,43 +24,120 @@ namespace AxibugEmuOnline.Client.Settings
     {
         public override int ControllerCount => 4;
 
-        protected override void OnRegistDevices(InputDevice_D device, BindingPage binding)
+        public override void Bind(Keyboard_D device, ControllerBinder controller)
         {
-            if (device is Keyboard_D keyboard)
+            switch (controller.ControllerIndex)
             {
-                switch (binding.ControllerIndex)
-                {
-                    case 0:
-                        binding.SetBinding(UMAMEKSingleKey.INSERT_COIN, keyboard.Q, 0);
-                        binding.SetBinding(UMAMEKSingleKey.GAMESTART, keyboard.E, 0);
-                        binding.SetBinding(UMAMEKSingleKey.UP, keyboard.W, 0);
-                        binding.SetBinding(UMAMEKSingleKey.DOWN, keyboard.S, 0);
-                        binding.SetBinding(UMAMEKSingleKey.LEFT, keyboard.A, 0);
-                        binding.SetBinding(UMAMEKSingleKey.RIGHT, keyboard.D, 0);
-                        binding.SetBinding(UMAMEKSingleKey.BTN_A, keyboard.J, 0);
-                        binding.SetBinding(UMAMEKSingleKey.BTN_B, keyboard.K, 0);
-                        binding.SetBinding(UMAMEKSingleKey.BTN_C, keyboard.L, 0);
-                        binding.SetBinding(UMAMEKSingleKey.BTN_D, keyboard.U, 0);
-                        binding.SetBinding(UMAMEKSingleKey.BTN_E, keyboard.I, 0);
-                        binding.SetBinding(UMAMEKSingleKey.BTN_F, keyboard.O, 0);
-                        break;
-                    case 1:
-                        binding.SetBinding(UMAMEKSingleKey.INSERT_COIN, keyboard.Delete, 0);
-                        binding.SetBinding(UMAMEKSingleKey.GAMESTART, keyboard.PageDown, 0);
-                        binding.SetBinding(UMAMEKSingleKey.UP, keyboard.UpArrow, 0);
-                        binding.SetBinding(UMAMEKSingleKey.DOWN, keyboard.DownArrow, 0);
-                        binding.SetBinding(UMAMEKSingleKey.LEFT, keyboard.LeftArrow, 0);
-                        binding.SetBinding(UMAMEKSingleKey.RIGHT, keyboard.RightArrow, 0);
-                        binding.SetBinding(UMAMEKSingleKey.BTN_A, keyboard.Keypad1, 0);
-                        binding.SetBinding(UMAMEKSingleKey.BTN_B, keyboard.Keypad2, 0);
-                        binding.SetBinding(UMAMEKSingleKey.BTN_C, keyboard.Keypad3, 0);
-                        binding.SetBinding(UMAMEKSingleKey.BTN_D, keyboard.Keypad4, 0);
-                        binding.SetBinding(UMAMEKSingleKey.BTN_E, keyboard.Keypad5, 0);
-                        binding.SetBinding(UMAMEKSingleKey.BTN_F, keyboard.Keypad6, 0);
-                        break;
-                }
+                case 0:
+                    controller.SetBinding(UMAMEKSingleKey.INSERT_COIN, device.Q, 0);
+                    controller.SetBinding(UMAMEKSingleKey.GAMESTART, device.E, 0);
+                    controller.SetBinding(UMAMEKSingleKey.UP, device.W, 0);
+                    controller.SetBinding(UMAMEKSingleKey.DOWN, device.S, 0);
+                    controller.SetBinding(UMAMEKSingleKey.LEFT, device.A, 0);
+                    controller.SetBinding(UMAMEKSingleKey.RIGHT, device.D, 0);
+                    controller.SetBinding(UMAMEKSingleKey.BTN_A, device.J, 0);
+                    controller.SetBinding(UMAMEKSingleKey.BTN_B, device.K, 0);
+                    controller.SetBinding(UMAMEKSingleKey.BTN_C, device.L, 0);
+                    controller.SetBinding(UMAMEKSingleKey.BTN_D, device.U, 0);
+                    controller.SetBinding(UMAMEKSingleKey.BTN_E, device.I, 0);
+                    controller.SetBinding(UMAMEKSingleKey.BTN_F, device.O, 0);
+                    break;
+                case 1:
+                    controller.SetBinding(UMAMEKSingleKey.INSERT_COIN, device.Delete, 0);
+                    controller.SetBinding(UMAMEKSingleKey.GAMESTART, device.PageDown, 0);
+                    controller.SetBinding(UMAMEKSingleKey.UP, device.UpArrow, 0);
+                    controller.SetBinding(UMAMEKSingleKey.DOWN, device.DownArrow, 0);
+                    controller.SetBinding(UMAMEKSingleKey.LEFT, device.LeftArrow, 0);
+                    controller.SetBinding(UMAMEKSingleKey.RIGHT, device.RightArrow, 0);
+                    controller.SetBinding(UMAMEKSingleKey.BTN_A, device.Keypad1, 0);
+                    controller.SetBinding(UMAMEKSingleKey.BTN_B, device.Keypad2, 0);
+                    controller.SetBinding(UMAMEKSingleKey.BTN_C, device.Keypad3, 0);
+                    controller.SetBinding(UMAMEKSingleKey.BTN_D, device.Keypad4, 0);
+                    controller.SetBinding(UMAMEKSingleKey.BTN_E, device.Keypad5, 0);
+                    controller.SetBinding(UMAMEKSingleKey.BTN_F, device.Keypad6, 0);
+                    break;
             }
         }
+        public override void Bind(DualShockController_D device, ControllerBinder controller)
+        {
+            controller.SetBinding(UMAMEKSingleKey.INSERT_COIN, device.Share, 0);
+            controller.SetBinding(UMAMEKSingleKey.GAMESTART, device.Options, 0);
+            controller.SetBinding(UMAMEKSingleKey.UP, device.Up, 0);
+            controller.SetBinding(UMAMEKSingleKey.DOWN, device.Down, 0);
+            controller.SetBinding(UMAMEKSingleKey.LEFT, device.Left, 0);
+            controller.SetBinding(UMAMEKSingleKey.RIGHT, device.Right, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_A, device.Square, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_B, device.Cross, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_C, device.Circle, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_D, device.Triangle, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_E, device.R1, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_F, device.R2, 0);
+
+            controller.SetBinding(UMAMEKSingleKey.UP, device.LeftStick.Up, 1);
+            controller.SetBinding(UMAMEKSingleKey.DOWN, device.LeftStick.Down, 1);
+            controller.SetBinding(UMAMEKSingleKey.LEFT, device.LeftStick.Left, 1);
+            controller.SetBinding(UMAMEKSingleKey.RIGHT, device.LeftStick.Right, 1);
+        }
+        public override void Bind(GamePad_D device, ControllerBinder controller)
+        {
+            controller.SetBinding(UMAMEKSingleKey.INSERT_COIN, device.Select, 0);
+            controller.SetBinding(UMAMEKSingleKey.GAMESTART, device.Start, 0);
+            controller.SetBinding(UMAMEKSingleKey.UP, device.Up, 0);
+            controller.SetBinding(UMAMEKSingleKey.DOWN, device.Down, 0);
+            controller.SetBinding(UMAMEKSingleKey.LEFT, device.Left, 0);
+            controller.SetBinding(UMAMEKSingleKey.RIGHT, device.Right, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_A, device.West, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_B, device.South, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_C, device.East, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_D, device.North, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_E, device.RightShoulder, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_F, device.RightTrigger, 0);
+
+            controller.SetBinding(UMAMEKSingleKey.UP, device.LeftStick.Up, 1);
+            controller.SetBinding(UMAMEKSingleKey.DOWN, device.LeftStick.Down, 1);
+            controller.SetBinding(UMAMEKSingleKey.LEFT, device.LeftStick.Left, 1);
+            controller.SetBinding(UMAMEKSingleKey.RIGHT, device.LeftStick.Right, 1);
+        }
+        public override void Bind(PSVController_D device, ControllerBinder controller)
+        {
+            controller.SetBinding(UMAMEKSingleKey.INSERT_COIN, device.Select, 0);
+            controller.SetBinding(UMAMEKSingleKey.GAMESTART, device.Start, 0);
+            controller.SetBinding(UMAMEKSingleKey.UP, device.Up, 0);
+            controller.SetBinding(UMAMEKSingleKey.DOWN, device.Down, 0);
+            controller.SetBinding(UMAMEKSingleKey.LEFT, device.Left, 0);
+            controller.SetBinding(UMAMEKSingleKey.RIGHT, device.Right, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_A, device.Square, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_B, device.Cross, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_C, device.Circle, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_D, device.Triangle, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_E, device.L, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_F, device.R, 0);
+
+            controller.SetBinding(UMAMEKSingleKey.UP, device.LeftStick.Up, 1);
+            controller.SetBinding(UMAMEKSingleKey.DOWN, device.LeftStick.Down, 1);
+            controller.SetBinding(UMAMEKSingleKey.LEFT, device.LeftStick.Left, 1);
+            controller.SetBinding(UMAMEKSingleKey.RIGHT, device.LeftStick.Right, 1);
+        }
+        public override void Bind(XboxController_D device, ControllerBinder controller)
+        {
+            controller.SetBinding(UMAMEKSingleKey.INSERT_COIN, device.View, 0);
+            controller.SetBinding(UMAMEKSingleKey.GAMESTART, device.Menu, 0);
+            controller.SetBinding(UMAMEKSingleKey.UP, device.Up, 0);
+            controller.SetBinding(UMAMEKSingleKey.DOWN, device.Down, 0);
+            controller.SetBinding(UMAMEKSingleKey.LEFT, device.Left, 0);
+            controller.SetBinding(UMAMEKSingleKey.RIGHT, device.Right, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_A, device.X, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_B, device.A, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_C, device.B, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_D, device.Y, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_E, device.RightBumper, 0);
+            controller.SetBinding(UMAMEKSingleKey.BTN_F, device.RightTrigger, 0);
+
+            controller.SetBinding(UMAMEKSingleKey.UP, device.LeftStick.Up, 1);
+            controller.SetBinding(UMAMEKSingleKey.DOWN, device.LeftStick.Down, 1);
+            controller.SetBinding(UMAMEKSingleKey.LEFT, device.LeftStick.Left, 1);
+            controller.SetBinding(UMAMEKSingleKey.RIGHT, device.LeftStick.Right, 1);
+        }
     }
 
     public class NEOGEOKeyBinding : MAMEKeyBinding
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/NesKeyBinding.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/NesKeyBinding.cs
index 3ab0e60e..39ddbade 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/NesKeyBinding.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/NesKeyBinding.cs
@@ -9,35 +9,100 @@ namespace AxibugEmuOnline.Client.Settings
         public override RomPlatformType Platform => RomPlatformType.Nes;
         public override int ControllerCount => 4;
 
-        protected override void OnRegistDevices(InputDevice_D device, BindingPage binding)
+        public override void Bind(Keyboard_D device, ControllerBinder controller)
         {
-            if (device is Keyboard_D keyboard)
+            switch (controller.ControllerIndex)
             {
-                switch (binding.ControllerIndex)
-                {
-                    case 0:
-                        binding.SetBinding(EnumButtonType.LEFT, keyboard.A, 0);
-                        binding.SetBinding(EnumButtonType.RIGHT, keyboard.D, 0);
-                        binding.SetBinding(EnumButtonType.UP, keyboard.W, 0);
-                        binding.SetBinding(EnumButtonType.DOWN, keyboard.S, 0);
-                        binding.SetBinding(EnumButtonType.A, keyboard.K, 0);
-                        binding.SetBinding(EnumButtonType.B, keyboard.J, 0);
-                        binding.SetBinding(EnumButtonType.SELECT, keyboard.V, 0);
-                        binding.SetBinding(EnumButtonType.START, keyboard.B, 0);
-                        binding.SetBinding(EnumButtonType.MIC, keyboard.M, 0);
-                        break;
-                    case 1:
-                        binding.SetBinding(EnumButtonType.UP, keyboard.UpArrow, 0);
-                        binding.SetBinding(EnumButtonType.DOWN, keyboard.DownArrow, 0);
-                        binding.SetBinding(EnumButtonType.LEFT, keyboard.LeftArrow, 0);
-                        binding.SetBinding(EnumButtonType.RIGHT, keyboard.RightArrow, 0);
-                        binding.SetBinding(EnumButtonType.A, keyboard.Keypad2, 0);
-                        binding.SetBinding(EnumButtonType.B, keyboard.Keypad1, 0);
-                        binding.SetBinding(EnumButtonType.SELECT, keyboard.Keypad0, 0);
-                        binding.SetBinding(EnumButtonType.START, keyboard.KeypadPeriod, 0);
-                        break;
-                }
+                case 0:
+                    controller.SetBinding(EnumButtonType.LEFT, device.A, 0);
+                    controller.SetBinding(EnumButtonType.RIGHT, device.D, 0);
+                    controller.SetBinding(EnumButtonType.UP, device.W, 0);
+                    controller.SetBinding(EnumButtonType.DOWN, device.S, 0);
+                    controller.SetBinding(EnumButtonType.A, device.K, 0);
+                    controller.SetBinding(EnumButtonType.B, device.J, 0);
+                    controller.SetBinding(EnumButtonType.SELECT, device.V, 0);
+                    controller.SetBinding(EnumButtonType.START, device.B, 0);
+                    controller.SetBinding(EnumButtonType.MIC, device.M, 0);
+                    break;
+                case 1:
+                    controller.SetBinding(EnumButtonType.UP, device.UpArrow, 0);
+                    controller.SetBinding(EnumButtonType.DOWN, device.DownArrow, 0);
+                    controller.SetBinding(EnumButtonType.LEFT, device.LeftArrow, 0);
+                    controller.SetBinding(EnumButtonType.RIGHT, device.RightArrow, 0);
+                    controller.SetBinding(EnumButtonType.A, device.Keypad2, 0);
+                    controller.SetBinding(EnumButtonType.B, device.Keypad1, 0);
+                    controller.SetBinding(EnumButtonType.SELECT, device.Keypad0, 0);
+                    controller.SetBinding(EnumButtonType.START, device.KeypadPeriod, 0);
+                    break;
             }
         }
+        public override void Bind(DualShockController_D device, ControllerBinder controller)
+        {
+            controller.SetBinding(EnumButtonType.LEFT, device.Left, 0);
+            controller.SetBinding(EnumButtonType.RIGHT, device.Right, 0);
+            controller.SetBinding(EnumButtonType.UP, device.Up, 0);
+            controller.SetBinding(EnumButtonType.DOWN, device.Down, 0);
+            controller.SetBinding(EnumButtonType.A, device.Cross, 0);
+            controller.SetBinding(EnumButtonType.B, device.Square, 0);
+            controller.SetBinding(EnumButtonType.SELECT, device.Share, 0);
+            controller.SetBinding(EnumButtonType.START, device.Options, 0);
+            controller.SetBinding(EnumButtonType.MIC, device.L1, 0);
+
+            controller.SetBinding(EnumButtonType.LEFT, device.LeftStick.Left, 1);
+            controller.SetBinding(EnumButtonType.RIGHT, device.LeftStick.Right, 1);
+            controller.SetBinding(EnumButtonType.UP, device.LeftStick.Up, 1);
+            controller.SetBinding(EnumButtonType.DOWN, device.LeftStick.Down, 1);
+        }
+        public override void Bind(GamePad_D device, ControllerBinder controller)
+        {
+            controller.SetBinding(EnumButtonType.LEFT, device.Left, 0);
+            controller.SetBinding(EnumButtonType.RIGHT, device.Right, 0);
+            controller.SetBinding(EnumButtonType.UP, device.Up, 0);
+            controller.SetBinding(EnumButtonType.DOWN, device.Down, 0);
+            controller.SetBinding(EnumButtonType.A, device.South, 0);
+            controller.SetBinding(EnumButtonType.B, device.West, 0);
+            controller.SetBinding(EnumButtonType.SELECT, device.Select, 0);
+            controller.SetBinding(EnumButtonType.START, device.Start, 0);
+            controller.SetBinding(EnumButtonType.MIC, device.LeftShoulder, 0);
+
+            controller.SetBinding(EnumButtonType.LEFT, device.LeftStick.Left, 1);
+            controller.SetBinding(EnumButtonType.RIGHT, device.LeftStick.Right, 1);
+            controller.SetBinding(EnumButtonType.UP, device.LeftStick.Up, 1);
+            controller.SetBinding(EnumButtonType.DOWN, device.LeftStick.Down, 1);
+        }
+        public override void Bind(PSVController_D device, ControllerBinder controller)
+        {
+            controller.SetBinding(EnumButtonType.LEFT, device.Left, 0);
+            controller.SetBinding(EnumButtonType.RIGHT, device.Right, 0);
+            controller.SetBinding(EnumButtonType.UP, device.Up, 0);
+            controller.SetBinding(EnumButtonType.DOWN, device.Down, 0);
+            controller.SetBinding(EnumButtonType.A, device.Cross, 0);
+            controller.SetBinding(EnumButtonType.B, device.Square, 0);
+            controller.SetBinding(EnumButtonType.SELECT, device.Select, 0);
+            controller.SetBinding(EnumButtonType.START, device.Start, 0);
+            controller.SetBinding(EnumButtonType.MIC, device.L, 0);
+
+            controller.SetBinding(EnumButtonType.LEFT, device.LeftStick.Left, 0);
+            controller.SetBinding(EnumButtonType.RIGHT, device.LeftStick.Right, 0);
+            controller.SetBinding(EnumButtonType.UP, device.LeftStick.Up, 0);
+            controller.SetBinding(EnumButtonType.DOWN, device.LeftStick.Down, 0);
+        }
+        public override void Bind(XboxController_D device, ControllerBinder controller)
+        {
+            controller.SetBinding(EnumButtonType.LEFT, device.Left, 0);
+            controller.SetBinding(EnumButtonType.RIGHT, device.Right, 0);
+            controller.SetBinding(EnumButtonType.UP, device.Up, 0);
+            controller.SetBinding(EnumButtonType.DOWN, device.Down, 0);
+            controller.SetBinding(EnumButtonType.A, device.A, 0);
+            controller.SetBinding(EnumButtonType.B, device.X, 0);
+            controller.SetBinding(EnumButtonType.SELECT, device.View, 0);
+            controller.SetBinding(EnumButtonType.START, device.Menu, 0);
+            controller.SetBinding(EnumButtonType.MIC, device.LeftBumper, 0);
+
+            controller.SetBinding(EnumButtonType.LEFT, device.LeftStick.Left, 0);
+            controller.SetBinding(EnumButtonType.RIGHT, device.LeftStick.Right, 0);
+            controller.SetBinding(EnumButtonType.UP, device.LeftStick.Up, 0);
+            controller.SetBinding(EnumButtonType.DOWN, device.LeftStick.Down, 0);
+        }
     }
 }
\ No newline at end of file
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/XMBKeyBinding.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/XMBKeyBinding.cs
index caec9054..f749e14b 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/XMBKeyBinding.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/XMBKeyBinding.cs
@@ -9,38 +9,94 @@ namespace AxibugEmuOnline.Client
         public override RomPlatformType Platform => RomPlatformType.Invalid;
         public override int ControllerCount => 2;
 
-        protected override void OnRegistDevices(InputDevice_D device, BindingPage binding)
+        public override void Bind(Keyboard_D device, ControllerBinder controller)
         {
-            if (device is Keyboard_D keyboard)
+            switch (controller.ControllerIndex)
             {
-                switch (binding.ControllerIndex)
-                {
-                    case 0://设置标准UI控制
-                           //第一套控制布局 WSAD+JKLI
-                        binding.SetBinding(EnumCommand.Back, keyboard.L, 0);
-                        binding.SetBinding(EnumCommand.Enter, keyboard.K, 0);
-                        binding.SetBinding(EnumCommand.OptionMenu, keyboard.I, 0);
-                        binding.SetBinding(EnumCommand.SelectItemDown, keyboard.S, 0);
-                        binding.SetBinding(EnumCommand.SelectItemLeft, keyboard.A, 0);
-                        binding.SetBinding(EnumCommand.SelectItemRight, keyboard.D, 0);
-                        binding.SetBinding(EnumCommand.SelectItemUp, keyboard.W, 0);
+                case 0://设置标准UI控制 //第一套控制布局 WSAD+JKLI
+                    controller.SetBinding(EnumCommand.Back, device.L, 0);
+                    controller.SetBinding(EnumCommand.Enter, device.K, 0);
+                    controller.SetBinding(EnumCommand.OptionMenu, device.I, 0);
+                    controller.SetBinding(EnumCommand.SelectItemDown, device.S, 0);
+                    controller.SetBinding(EnumCommand.SelectItemLeft, device.A, 0);
+                    controller.SetBinding(EnumCommand.SelectItemRight, device.D, 0);
+                    controller.SetBinding(EnumCommand.SelectItemUp, device.W, 0);
 
-                        //第二套控制布局 LOWB用
-                        binding.SetBinding(EnumCommand.Back, keyboard.Escape, 1);
-                        binding.SetBinding(EnumCommand.Back, keyboard.Backspace, 2);
-                        binding.SetBinding(EnumCommand.Enter, keyboard.Return, 1);
-                        binding.SetBinding(EnumCommand.OptionMenu, keyboard.LeftShift, 1);
-                        binding.SetBinding(EnumCommand.OptionMenu, keyboard.RightShift, 2);
-                        binding.SetBinding(EnumCommand.SelectItemDown, keyboard.DownArrow, 1);
-                        binding.SetBinding(EnumCommand.SelectItemLeft, keyboard.LeftArrow, 1);
-                        binding.SetBinding(EnumCommand.SelectItemRight, keyboard.RightArrow, 1);
-                        binding.SetBinding(EnumCommand.SelectItemUp, keyboard.UpArrow, 1);
-                        break;
-                    case 1://游戏中UI控制
-                        binding.SetBinding(EnumCommand.OptionMenu, keyboard.Escape, 0);
-                        break;
-                }
+                    //第二套控制布局 LOWB用
+                    controller.SetBinding(EnumCommand.Back, device.Escape, 1);
+                    controller.SetBinding(EnumCommand.Back, device.Backspace, 2);
+                    controller.SetBinding(EnumCommand.Enter, device.Return, 1);
+                    controller.SetBinding(EnumCommand.OptionMenu, device.LeftShift, 1);
+                    controller.SetBinding(EnumCommand.OptionMenu, device.RightShift, 2);
+                    controller.SetBinding(EnumCommand.SelectItemDown, device.DownArrow, 1);
+                    controller.SetBinding(EnumCommand.SelectItemLeft, device.LeftArrow, 1);
+                    controller.SetBinding(EnumCommand.SelectItemRight, device.RightArrow, 1);
+                    controller.SetBinding(EnumCommand.SelectItemUp, device.UpArrow, 1);
+                    break;
+                case 1://游戏中UI控制
+                    controller.SetBinding(EnumCommand.OptionMenu, device.Escape, 0);
+                    break;
             }
         }
+        public override void Bind(DualShockController_D device, ControllerBinder controller)
+        {
+            controller.SetBinding(EnumCommand.Back, device.Circle, 0);
+            controller.SetBinding(EnumCommand.Enter, device.Cross, 0);
+            controller.SetBinding(EnumCommand.OptionMenu, device.Options, 0);
+            controller.SetBinding(EnumCommand.SelectItemDown, device.Down, 0);
+            controller.SetBinding(EnumCommand.SelectItemLeft, device.Left, 0);
+            controller.SetBinding(EnumCommand.SelectItemRight, device.Right, 0);
+            controller.SetBinding(EnumCommand.SelectItemUp, device.Up, 0);
+
+            controller.SetBinding(EnumCommand.SelectItemDown, device.LeftStick.Down, 1);
+            controller.SetBinding(EnumCommand.SelectItemLeft, device.LeftStick.Left, 1);
+            controller.SetBinding(EnumCommand.SelectItemRight, device.LeftStick.Right, 1);
+            controller.SetBinding(EnumCommand.SelectItemUp, device.LeftStick.Up, 1);
+        }
+        public override void Bind(GamePad_D device, ControllerBinder controller)
+        {
+            controller.SetBinding(EnumCommand.Back, device.East, 0);
+            controller.SetBinding(EnumCommand.Enter, device.South, 0);
+            controller.SetBinding(EnumCommand.OptionMenu, device.Start, 0);
+            controller.SetBinding(EnumCommand.SelectItemDown, device.Down, 0);
+            controller.SetBinding(EnumCommand.SelectItemLeft, device.Left, 0);
+            controller.SetBinding(EnumCommand.SelectItemRight, device.Right, 0);
+            controller.SetBinding(EnumCommand.SelectItemUp, device.Up, 0);
+
+            controller.SetBinding(EnumCommand.SelectItemDown, device.LeftStick.Down, 1);
+            controller.SetBinding(EnumCommand.SelectItemLeft, device.LeftStick.Left, 1);
+            controller.SetBinding(EnumCommand.SelectItemRight, device.LeftStick.Right, 1);
+            controller.SetBinding(EnumCommand.SelectItemUp, device.LeftStick.Up, 1);
+        }
+        public override void Bind(PSVController_D device, ControllerBinder controller)
+        {
+            controller.SetBinding(EnumCommand.Back, device.Circle, 0);
+            controller.SetBinding(EnumCommand.Enter, device.Cross, 0);
+            controller.SetBinding(EnumCommand.OptionMenu, device.Start, 0);
+            controller.SetBinding(EnumCommand.SelectItemDown, device.Down, 0);
+            controller.SetBinding(EnumCommand.SelectItemLeft, device.Left, 0);
+            controller.SetBinding(EnumCommand.SelectItemRight, device.Right, 0);
+            controller.SetBinding(EnumCommand.SelectItemUp, device.Up, 0);
+
+            controller.SetBinding(EnumCommand.SelectItemDown, device.LeftStick.Down, 1);
+            controller.SetBinding(EnumCommand.SelectItemLeft, device.LeftStick.Left, 1);
+            controller.SetBinding(EnumCommand.SelectItemRight, device.LeftStick.Right, 1);
+            controller.SetBinding(EnumCommand.SelectItemUp, device.LeftStick.Up, 1);
+        }
+        public override void Bind(XboxController_D device, ControllerBinder controller)
+        {
+            controller.SetBinding(EnumCommand.Back, device.B, 0);
+            controller.SetBinding(EnumCommand.Enter, device.A, 0);
+            controller.SetBinding(EnumCommand.OptionMenu, device.Menu, 0);
+            controller.SetBinding(EnumCommand.SelectItemDown, device.Down, 0);
+            controller.SetBinding(EnumCommand.SelectItemLeft, device.Left, 0);
+            controller.SetBinding(EnumCommand.SelectItemRight, device.Right, 0);
+            controller.SetBinding(EnumCommand.SelectItemUp, device.Up, 0);
+
+            controller.SetBinding(EnumCommand.SelectItemDown, device.LeftStick.Down, 1);
+            controller.SetBinding(EnumCommand.SelectItemLeft, device.LeftStick.Left, 1);
+            controller.SetBinding(EnumCommand.SelectItemRight, device.LeftStick.Right, 1);
+            controller.SetBinding(EnumCommand.SelectItemUp, device.LeftStick.Up, 1);
+        }
     }
 }
\ No newline at end of file
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/Stick_C.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/Stick_C.cs
index 26cdf723..2243ef8a 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/Stick_C.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/Stick_C.cs
@@ -7,7 +7,7 @@ namespace AxibugEmuOnline.Client.InputDevices
     /// </summary>
     public class Stick_C : InputControl_C
     {
-        public VirtualButton UP;
+        public VirtualButton Up;
         public VirtualButton Down;
         public VirtualButton Left;
         public VirtualButton Right;
@@ -20,8 +20,8 @@ namespace AxibugEmuOnline.Client.InputDevices
         {
             var axis = GetVector2();
 
-            UP.m_performing = axis.y > 0f;
-            UP.Update();
+            Up.m_performing = axis.y > 0f;
+            Up.Update();
 
             Down.m_performing = axis.y < 0f;
             Down.Update();
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputDevicesManager.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputDevicesManager.cs
index 0de419b2..b41cc3cb 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputDevicesManager.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputDevicesManager.cs
@@ -55,6 +55,14 @@ namespace AxibugEmuOnline.Client.InputDevices
 
             return null;
         }
+        /// <summary>
+        /// 获得所有存在的输入设备
+        /// </summary>
+        /// <returns></returns>
+        public IEnumerable<InputDevice_D> GetDevices()
+        {
+            return m_devices.Values;
+        }
 
         /// <summary> 由外部驱动的逻辑更新入口 </summary>
         public void Update()
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputSystemResolver.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputSystemResolver.cs
index 82f226ce..6f2c76ab 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputSystemResolver.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputSystemResolver.cs
@@ -1,12 +1,8 @@
 #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;
 using UnityEngine.InputSystem.DualShock;
-using UnityEngine.InputSystem.Haptics;
 using UnityEngine.InputSystem.XInput;
 
 namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem
@@ -249,7 +245,7 @@ namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem
                 mapper[ds_d.LeftStick] = ipDsGamePad.leftStick;
                 mapper[ds_d.RightStick] = ipDsGamePad.rightStick;
             }
-            else if(device_d is XboxController_D xbox_d)
+            else if (device_d is XboxController_D xbox_d)
             {
                 var ipXInputGamePad = ipdevice as XInputController;
                 mapper[xbox_d.X] = ipXInputGamePad.xButton;