From f7633ea3416ed8c851918bf31b28611cbe24c205 Mon Sep 17 00:00:00 2001
From: sin365 <353374337@qq.com>
Date: Thu, 6 Mar 2025 23:11:54 +0800
Subject: [PATCH] =?UTF-8?q?=E5=B0=81=E8=A3=85GUI=E8=99=9A=E6=8B=9F?=
 =?UTF-8?q?=E6=8C=89=E9=94=AE=E5=8A=9F=E8=83=BD=E7=BB=84=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../AxiInput/AxiInputUGUIHandleBase.cs        |  27 --
 ...Settings.meta => AxiInputSP.Settings.meta} |   0
 .../ColecoVisionMultiKeysSetting.cs           |   2 +-
 .../ColecoVisionMultiKeysSetting.cs.meta      |   0
 .../GameBoyColorMultiKeysSetting.cs           |   2 +-
 .../GameBoyColorMultiKeysSetting.cs.meta      |   0
 .../GameBoyMultiKeysSetting.cs                |   2 +-
 .../GameBoyMultiKeysSetting.cs.meta           |   0
 .../GameGearMultiKeysSetting.cs               |   2 +-
 .../GameGearMultiKeysSetting.cs.meta          |   0
 .../GamingMultiKeysSetting.cs                 |   2 +-
 .../GamingMultiKeysSetting.cs.meta            |   0
 .../MasterSystemMultiKeysSetting.cs           |   2 +-
 .../MasterSystemMultiKeysSetting.cs.meta      |   0
 .../NESMultiKeysSetting.cs                    |   3 +-
 .../NESMultiKeysSetting.cs.meta               |   0
 .../SC3000MultiKeysSetting.cs                 |   2 +-
 .../SC3000MultiKeysSetting.cs.meta            |   0
 .../SG1000MultiKeysSetting.cs                 |   2 +-
 .../SG1000MultiKeysSetting.cs.meta            |   0
 .../UMAMEMultiKeysSetting.cs                  |   2 +-
 .../UMAMEMultiKeysSetting.cs.meta             |   0
 .../XMBMultiKeysSetting.cs                    |   2 +-
 .../XMBMultiKeysSetting.cs.meta               |   0
 .../{AxiInput.meta => AxiInputSP.meta}        |   0
 .../AxiInput.Struct.cs                        |   2 +-
 .../AxiInput.Struct.cs.meta                   |   0
 .../{AxiInput => AxiInputSP}/AxiInputEx.cs    |   6 +-
 .../AxiInputEx.cs.meta                        |   0
 .../AxiInputUGUICenter.cs.meta                |   0
 .../AxiInputUGUIHandle.cs.meta}               |   0
 .../Axis}/AxiInputAxisCenter.cs               |   4 +-
 .../Axis}/AxiInputAxisCenter.cs.meta          |   0
 .../{Common => AxiInputSP}/PC_XBOXKEY.cs      |   2 +-
 .../{Common => AxiInputSP}/PSVitaKey.cs       |   2 +-
 .../UGUI}/AxiInputUGUICenter.cs               |  22 +-
 .../AxiInputSP/UGUI/AxiInputUGUIHandle.cs     |  40 +++
 .../AppMain/AxiInputSP/UGUI/AxiIptButton.cs   |  92 +++++++
 .../NesEmulator/NesControllerMapper.cs        | 260 +++++++++---------
 .../IkeyMapperChanger/GamingChanger.cs        |   4 +-
 .../IkeyMapperChanger/NormalChanger.cs        |   4 +-
 .../Assets/Script/AppMain/Manager/AppInput.cs |   8 +-
 .../UI/CommandDispatcher/CommandListener.cs   |   5 +-
 43 files changed, 300 insertions(+), 201 deletions(-)
 delete mode 100644 AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputUGUIHandleBase.cs
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings.meta => AxiInputSP.Settings.meta} (100%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/ColecoVisionMultiKeysSetting.cs (99%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/ColecoVisionMultiKeysSetting.cs.meta (100%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/GameBoyColorMultiKeysSetting.cs (98%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/GameBoyColorMultiKeysSetting.cs.meta (100%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/GameBoyMultiKeysSetting.cs (98%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/GameBoyMultiKeysSetting.cs.meta (100%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/GameGearMultiKeysSetting.cs (99%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/GameGearMultiKeysSetting.cs.meta (100%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/GamingMultiKeysSetting.cs (96%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/GamingMultiKeysSetting.cs.meta (100%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/MasterSystemMultiKeysSetting.cs (99%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/MasterSystemMultiKeysSetting.cs.meta (100%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/NESMultiKeysSetting.cs (99%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/NESMultiKeysSetting.cs.meta (100%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/SC3000MultiKeysSetting.cs (99%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/SC3000MultiKeysSetting.cs.meta (100%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/SG1000MultiKeysSetting.cs (99%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/SG1000MultiKeysSetting.cs.meta (100%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/UMAMEMultiKeysSetting.cs (99%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/UMAMEMultiKeysSetting.cs.meta (100%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/XMBMultiKeysSetting.cs (98%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.Settings => AxiInputSP.Settings}/XMBMultiKeysSetting.cs.meta (100%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput.meta => AxiInputSP.meta} (100%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput => AxiInputSP}/AxiInput.Struct.cs (96%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput => AxiInputSP}/AxiInput.Struct.cs.meta (100%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput => AxiInputSP}/AxiInputEx.cs (96%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput => AxiInputSP}/AxiInputEx.cs.meta (100%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput => AxiInputSP}/AxiInputUGUICenter.cs.meta (100%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput/AxiInputUGUIHandleBase.cs.meta => AxiInputSP/AxiInputUGUIHandle.cs.meta} (100%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput => AxiInputSP/Axis}/AxiInputAxisCenter.cs (97%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput => AxiInputSP/Axis}/AxiInputAxisCenter.cs.meta (100%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{Common => AxiInputSP}/PC_XBOXKEY.cs (95%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{Common => AxiInputSP}/PSVitaKey.cs (96%)
 rename AxibugEmuOnline.Client/Assets/Script/AppMain/{AxiInput => AxiInputSP/UGUI}/AxiInputUGUICenter.cs (74%)
 create mode 100644 AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/UGUI/AxiInputUGUIHandle.cs
 create mode 100644 AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/UGUI/AxiIptButton.cs

diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputUGUIHandleBase.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputUGUIHandleBase.cs
deleted file mode 100644
index ed1f3990..00000000
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputUGUIHandleBase.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using AxibugEmuOnline.Client.Manager;
-using System;
-
-namespace Assets.Script.AppMain.AxiInput
-{
-    public abstract class AxiInputUGUIHandleBase : IDisposable
-    {
-        public int Handle { get; private set; }
-        public AxiInputUGuiBtnType UguiBtnType { get; private set; }
-
-        public AxiInputUGUIHandleBase(AxiInputUGuiBtnType uguiBtnType)
-        {
-
-            Handle = AxiInputUGUICenter.GetNextSeed();
-            this.UguiBtnType = uguiBtnType;
-            AxiInputUGUICenter.RegHandle(this);
-        }
-        public abstract bool GetKeyDown();
-        public abstract bool GetKey();
-        public abstract bool GetKeyUp();
-
-        public void Dispose()
-        {
-            AxiInputUGUICenter.UnregHandle(this);
-        }
-    }
-}
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/ColecoVisionMultiKeysSetting.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/ColecoVisionMultiKeysSetting.cs
similarity index 99%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/ColecoVisionMultiKeysSetting.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/ColecoVisionMultiKeysSetting.cs
index d8781b9b..c3fd560c 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/ColecoVisionMultiKeysSetting.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/ColecoVisionMultiKeysSetting.cs
@@ -1,7 +1,7 @@
 using AxibugEmuOnline.Client.Manager;
 using UnityEngine;
 
-namespace Assets.Script.AppMain.AxiInput.Settings
+namespace AxiInputSP.Setting
 {
     public class ColecoVisionMultiKeysSetting : MultiKeysSettingBase
     {
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/ColecoVisionMultiKeysSetting.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/ColecoVisionMultiKeysSetting.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/ColecoVisionMultiKeysSetting.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/ColecoVisionMultiKeysSetting.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GameBoyColorMultiKeysSetting.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GameBoyColorMultiKeysSetting.cs
similarity index 98%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GameBoyColorMultiKeysSetting.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GameBoyColorMultiKeysSetting.cs
index ee135cf6..2edbae4c 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GameBoyColorMultiKeysSetting.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GameBoyColorMultiKeysSetting.cs
@@ -1,7 +1,7 @@
 using AxibugEmuOnline.Client.Manager;
 using UnityEngine;
 
-namespace Assets.Script.AppMain.AxiInput.Settings
+namespace AxiInputSP.Setting
 {
     public class GameBoyColorMultiKeysSetting : MultiKeysSettingBase
     {
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GameBoyColorMultiKeysSetting.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GameBoyColorMultiKeysSetting.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GameBoyColorMultiKeysSetting.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GameBoyColorMultiKeysSetting.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GameBoyMultiKeysSetting.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GameBoyMultiKeysSetting.cs
similarity index 98%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GameBoyMultiKeysSetting.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GameBoyMultiKeysSetting.cs
index 7c5fb01c..3775c27d 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GameBoyMultiKeysSetting.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GameBoyMultiKeysSetting.cs
@@ -1,7 +1,7 @@
 using AxibugEmuOnline.Client.Manager;
 using UnityEngine;
 
-namespace Assets.Script.AppMain.AxiInput.Settings
+namespace AxiInputSP.Setting
 {
     public class GameBoyMultiKeysSetting : MultiKeysSettingBase
     {
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GameBoyMultiKeysSetting.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GameBoyMultiKeysSetting.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GameBoyMultiKeysSetting.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GameBoyMultiKeysSetting.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GameGearMultiKeysSetting.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GameGearMultiKeysSetting.cs
similarity index 99%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GameGearMultiKeysSetting.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GameGearMultiKeysSetting.cs
index 5e7dc5fd..ea895f7d 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GameGearMultiKeysSetting.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GameGearMultiKeysSetting.cs
@@ -1,7 +1,7 @@
 using AxibugEmuOnline.Client.Manager;
 using UnityEngine;
 
-namespace Assets.Script.AppMain.AxiInput.Settings
+namespace AxiInputSP.Setting
 {
     public class GameGearMultiKeysSetting : MultiKeysSettingBase
     {
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GameGearMultiKeysSetting.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GameGearMultiKeysSetting.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GameGearMultiKeysSetting.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GameGearMultiKeysSetting.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GamingMultiKeysSetting.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GamingMultiKeysSetting.cs
similarity index 96%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GamingMultiKeysSetting.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GamingMultiKeysSetting.cs
index 91e3f459..a0f060ae 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GamingMultiKeysSetting.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GamingMultiKeysSetting.cs
@@ -3,7 +3,7 @@ using AxibugEmuOnline.Client.Common;
 using AxibugEmuOnline.Client.Manager;
 using UnityEngine;
 
-namespace Assets.Script.AppMain.AxiInput.Settings
+namespace AxiInputSP.Setting
 {
     public class GamingMultiKeysSetting : MultiKeysSettingBase
     {
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GamingMultiKeysSetting.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GamingMultiKeysSetting.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/GamingMultiKeysSetting.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/GamingMultiKeysSetting.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/MasterSystemMultiKeysSetting.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/MasterSystemMultiKeysSetting.cs
similarity index 99%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/MasterSystemMultiKeysSetting.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/MasterSystemMultiKeysSetting.cs
index de8d7491..b471b7c8 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/MasterSystemMultiKeysSetting.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/MasterSystemMultiKeysSetting.cs
@@ -2,7 +2,7 @@
 using System;
 using UnityEngine;
 
-namespace Assets.Script.AppMain.AxiInput.Settings
+namespace AxiInputSP.Setting
 {
     [Flags]
     public enum EssgeeSingleKey : ushort
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/MasterSystemMultiKeysSetting.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/MasterSystemMultiKeysSetting.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/MasterSystemMultiKeysSetting.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/MasterSystemMultiKeysSetting.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/NESMultiKeysSetting.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/NESMultiKeysSetting.cs
similarity index 99%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/NESMultiKeysSetting.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/NESMultiKeysSetting.cs
index e8aa0115..1a361408 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/NESMultiKeysSetting.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/NESMultiKeysSetting.cs
@@ -1,8 +1,9 @@
 using AxibugEmuOnline.Client.Manager;
+using AxiInputSP;
 using UnityEngine;
 using VirtualNes.Core;
 
-namespace Assets.Script.AppMain.AxiInput.Settings
+namespace AxiInputSP.Setting
 {
     public class NESMultiKeysSetting : MultiKeysSettingBase
     {
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/NESMultiKeysSetting.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/NESMultiKeysSetting.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/NESMultiKeysSetting.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/NESMultiKeysSetting.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/SC3000MultiKeysSetting.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/SC3000MultiKeysSetting.cs
similarity index 99%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/SC3000MultiKeysSetting.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/SC3000MultiKeysSetting.cs
index 9bafd17f..d1c6f5ee 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/SC3000MultiKeysSetting.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/SC3000MultiKeysSetting.cs
@@ -1,7 +1,7 @@
 using AxibugEmuOnline.Client.Manager;
 using UnityEngine;
 
-namespace Assets.Script.AppMain.AxiInput.Settings
+namespace AxiInputSP.Setting
 {
     public class SC3000MultiKeysSetting : MultiKeysSettingBase
     {
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/SC3000MultiKeysSetting.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/SC3000MultiKeysSetting.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/SC3000MultiKeysSetting.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/SC3000MultiKeysSetting.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/SG1000MultiKeysSetting.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/SG1000MultiKeysSetting.cs
similarity index 99%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/SG1000MultiKeysSetting.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/SG1000MultiKeysSetting.cs
index 2324e159..30d8e877 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/SG1000MultiKeysSetting.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/SG1000MultiKeysSetting.cs
@@ -1,7 +1,7 @@
 using AxibugEmuOnline.Client.Manager;
 using UnityEngine;
 
-namespace Assets.Script.AppMain.AxiInput.Settings
+namespace AxiInputSP.Setting
 {
     public class SG1000MultiKeysSetting : MultiKeysSettingBase
     {
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/SG1000MultiKeysSetting.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/SG1000MultiKeysSetting.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/SG1000MultiKeysSetting.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/SG1000MultiKeysSetting.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/UMAMEMultiKeysSetting.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/UMAMEMultiKeysSetting.cs
similarity index 99%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/UMAMEMultiKeysSetting.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/UMAMEMultiKeysSetting.cs
index 0e8c96b0..3270141a 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/UMAMEMultiKeysSetting.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/UMAMEMultiKeysSetting.cs
@@ -1,7 +1,7 @@
 using AxibugEmuOnline.Client.Manager;
 using UnityEngine;
 
-namespace Assets.Script.AppMain.AxiInput.Settings
+namespace AxiInputSP.Setting
 {
     public enum UMAMEKSingleKey
     {
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/UMAMEMultiKeysSetting.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/UMAMEMultiKeysSetting.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/UMAMEMultiKeysSetting.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/UMAMEMultiKeysSetting.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/XMBMultiKeysSetting.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/XMBMultiKeysSetting.cs
similarity index 98%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/XMBMultiKeysSetting.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/XMBMultiKeysSetting.cs
index 95734be6..6901b197 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/XMBMultiKeysSetting.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/XMBMultiKeysSetting.cs
@@ -3,7 +3,7 @@ using AxibugEmuOnline.Client.Common;
 using AxibugEmuOnline.Client.Manager;
 using UnityEngine;
 
-namespace Assets.Script.AppMain.AxiInput.Settings
+namespace AxiInputSP.Setting
 {
     public class XMBMultiKeysSetting : MultiKeysSettingBase
     {
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/XMBMultiKeysSetting.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/XMBMultiKeysSetting.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.Settings/XMBMultiKeysSetting.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.Settings/XMBMultiKeysSetting.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInput.Struct.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/AxiInput.Struct.cs
similarity index 96%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInput.Struct.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/AxiInput.Struct.cs
index 3d874383..e6366f25 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInput.Struct.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/AxiInput.Struct.cs
@@ -2,7 +2,7 @@
 using System.Runtime.InteropServices;
 using UnityEngine;
 
-namespace Assets.Script.AppMain.AxiInput
+namespace AxiInputSP
 {
     [StructLayout(LayoutKind.Explicit, Size = 8)]
     public struct AxiInput
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInput.Struct.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/AxiInput.Struct.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInput.Struct.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/AxiInput.Struct.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputEx.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/AxiInputEx.cs
similarity index 96%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputEx.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/AxiInputEx.cs
index 3caf9a95..32b44d88 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputEx.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/AxiInputEx.cs
@@ -1,6 +1,8 @@
-using UnityEngine;
+using AxiInputSP.Axis;
+using AxiInputSP.UGUI;
+using UnityEngine;
 
-namespace Assets.Script.AppMain.AxiInput
+namespace AxiInputSP
 {
     public static class AxiInputEx
     {
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputEx.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/AxiInputEx.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputEx.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/AxiInputEx.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputUGUICenter.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/AxiInputUGUICenter.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputUGUICenter.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/AxiInputUGUICenter.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputUGUIHandleBase.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/AxiInputUGUIHandle.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputUGUIHandleBase.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/AxiInputUGUIHandle.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputAxisCenter.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/Axis/AxiInputAxisCenter.cs
similarity index 97%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputAxisCenter.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/Axis/AxiInputAxisCenter.cs
index 68baed5b..46366858 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputAxisCenter.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/Axis/AxiInputAxisCenter.cs
@@ -1,13 +1,13 @@
 using System.Collections.Generic;
 using UnityEngine;
 
-namespace Assets.Script.AppMain.AxiInput
+namespace AxiInputSP.Axis
 {
     public static class AxiInputAxisCenter
     {
         static long LastCheckFrame = -1;
 
-        public enum AxisState
+        enum AxisState
         {
             None,
             KeyUp,
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputAxisCenter.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/Axis/AxiInputAxisCenter.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputAxisCenter.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/Axis/AxiInputAxisCenter.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Common/PC_XBOXKEY.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/PC_XBOXKEY.cs
similarity index 95%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/Common/PC_XBOXKEY.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/PC_XBOXKEY.cs
index 873ae60f..173f3cb1 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Common/PC_XBOXKEY.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/PC_XBOXKEY.cs
@@ -1,6 +1,6 @@
 using UnityEngine;
 
-namespace AxibugEmuOnline.Client.Common
+namespace AxiInputSP
 {
     public static class PC_XBOXKEY
     {
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Common/PSVitaKey.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/PSVitaKey.cs
similarity index 96%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/Common/PSVitaKey.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/PSVitaKey.cs
index fd86bb22..9b006f86 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Common/PSVitaKey.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/PSVitaKey.cs
@@ -1,6 +1,6 @@
 using UnityEngine;
 
-namespace AxibugEmuOnline.Client.Common
+namespace AxiInputSP
 {
     public static class PSVitaKey
     {
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputUGUICenter.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/UGUI/AxiInputUGUICenter.cs
similarity index 74%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputUGUICenter.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/UGUI/AxiInputUGUICenter.cs
index d87ba1c7..50d8aa75 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInput/AxiInputUGUICenter.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/UGUI/AxiInputUGUICenter.cs
@@ -1,34 +1,34 @@
 using System.Collections.Generic;
 
-namespace Assets.Script.AppMain.AxiInput
+namespace AxiInputSP.UGUI
 {
     public static class AxiInputUGUICenter
     {
         static int handleSeed = 0;
-        static Dictionary<int, AxiInputUGUIHandleBase> dictHandle2AxiUgui = new Dictionary<int, AxiInputUGUIHandleBase>();
-        static Dictionary<AxiInputUGuiBtnType, List<AxiInputUGUIHandleBase>> dictBtnType2BtnList = new Dictionary<AxiInputUGuiBtnType, List<AxiInputUGUIHandleBase>>();
+        static Dictionary<int, AxiInputUGUIHandle> dictHandle2AxiUgui = new Dictionary<int, AxiInputUGUIHandle>();
+        static Dictionary<AxiInputUGuiBtnType, List<AxiInputUGUIHandle>> dictBtnType2BtnList = new Dictionary<AxiInputUGuiBtnType, List<AxiInputUGUIHandle>>();
 
         public static int GetNextSeed()
         {
             return ++handleSeed;
         }
-        public static void RegHandle(AxiInputUGUIHandleBase uiHandle)
+        public static void RegHandle(AxiInputUGUIHandle uiHandle)
         {
             dictHandle2AxiUgui[uiHandle.Handle] = uiHandle;
-            List<AxiInputUGUIHandleBase> list;
+            List<AxiInputUGUIHandle> list;
             if (dictBtnType2BtnList.TryGetValue(uiHandle.UguiBtnType, out list))
-                list = dictBtnType2BtnList[uiHandle.UguiBtnType] = new List<AxiInputUGUIHandleBase>();
+                list = dictBtnType2BtnList[uiHandle.UguiBtnType] = new List<AxiInputUGUIHandle>();
 
             if (!list.Contains(uiHandle))
                 list.Add(uiHandle);
         }
-        public static void UnregHandle(AxiInputUGUIHandleBase uiHandle)
+        public static void UnregHandle(AxiInputUGUIHandle uiHandle)
         {
             if (!dictHandle2AxiUgui.ContainsKey(uiHandle.Handle))
                 return;
             dictHandle2AxiUgui.Remove(uiHandle.Handle);
 
-            List<AxiInputUGUIHandleBase> list;
+            List<AxiInputUGUIHandle> list;
             if (dictBtnType2BtnList.TryGetValue(uiHandle.UguiBtnType, out list))
             {
                 if (list.Contains(uiHandle))
@@ -38,7 +38,7 @@ namespace Assets.Script.AppMain.AxiInput
 
         public static bool GetKeyUp(AxiInputUGuiBtnType btntype)
         {
-            List<AxiInputUGUIHandleBase> list;
+            List<AxiInputUGUIHandle> list;
             if (!dictBtnType2BtnList.TryGetValue(btntype, out list))
                 return false;
             for (int i = 0; i < list.Count; i++)
@@ -51,7 +51,7 @@ namespace Assets.Script.AppMain.AxiInput
 
         public static bool GetKeyDown(AxiInputUGuiBtnType btntype)
         {
-            List<AxiInputUGUIHandleBase> list;
+            List<AxiInputUGUIHandle> list;
             if (!dictBtnType2BtnList.TryGetValue(btntype, out list))
                 return false;
             for (int i = 0; i < list.Count; i++)
@@ -64,7 +64,7 @@ namespace Assets.Script.AppMain.AxiInput
 
         public static bool GetKey(AxiInputUGuiBtnType btntype)
         {
-            List<AxiInputUGUIHandleBase> list;
+            List<AxiInputUGUIHandle> list;
             if (!dictBtnType2BtnList.TryGetValue(btntype, out list))
                 return false;
             for (int i = 0; i < list.Count; i++)
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/UGUI/AxiInputUGUIHandle.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/UGUI/AxiInputUGUIHandle.cs
new file mode 100644
index 00000000..d19baceb
--- /dev/null
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/UGUI/AxiInputUGUIHandle.cs
@@ -0,0 +1,40 @@
+using System;
+
+namespace AxiInputSP.UGUI
+{
+    public class AxiInputUGUIHandle
+    {
+        public int Handle { get; private set; }
+        public AxiInputUGuiBtnType UguiBtnType { get; private set; }
+
+        public AxiInputUGUIHandle(AxiInputUGuiBtnType uguiBtnType)
+        {
+            Handle = AxiInputUGUICenter.GetNextSeed();
+            this.UguiBtnType = uguiBtnType;
+            AxiInputUGUICenter.RegHandle(this);
+        }
+        public bool GetKey()
+        {
+            return GetKeyHandle != null ? GetKeyHandle.Invoke() : false;
+        }
+        public bool GetKeyUp()
+        {
+            return GetKeyUpHandle != null ? GetKeyUpHandle.Invoke() : false;
+        }
+        public bool GetKeyDown()
+        {
+            return GetKeyDownHandle != null ? GetKeyDownHandle.Invoke() : false;
+        }
+        public Func<bool> GetKeyHandle;
+        public Func<bool> GetKeyUpHandle;
+        public Func<bool> GetKeyDownHandle;
+
+        public void Dispose()
+        {
+            GetKeyHandle = null;
+            GetKeyUpHandle = null;
+            GetKeyDownHandle = null;
+            AxiInputUGUICenter.UnregHandle(this);
+        }
+    }
+}
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/UGUI/AxiIptButton.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/UGUI/AxiIptButton.cs
new file mode 100644
index 00000000..2560707d
--- /dev/null
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/UGUI/AxiIptButton.cs
@@ -0,0 +1,92 @@
+using UnityEngine.EventSystems;
+
+namespace AxiInputSP.UGUI
+{
+    public class AxiIptButton : UnityEngine.UI.Button
+    {
+        enum AxiButtonState
+        {
+            None,
+            KeyUp,
+            KeyDown,
+            KeyHold
+        }
+
+        AxiInputUGUIHandle[] handles;
+        AxiButtonState m_state = AxiButtonState.None;
+        /// <summary>
+        /// 键值(支持组合键)
+        /// </summary>
+        public AxiInputUGuiBtnType[] axiBtnTypeList;
+        protected override void Awake()
+        {
+            base.Awake();
+            if (axiBtnTypeList != null)
+            {
+                handles = new AxiInputUGUIHandle[axiBtnTypeList.Length];
+                for (int i = 0; i < axiBtnTypeList.Length; i++)
+                {
+                    handles[i] = new AxiInputUGUIHandle(axiBtnTypeList[i]);
+                    handles[i].GetKeyHandle = GetKey;
+                    handles[i].GetKeyUpHandle = GetKeyUp;
+                    handles[i].GetKeyDownHandle = GetKeyDown;
+                }
+            }
+        }
+
+        protected override void OnDestroy()
+        {
+            base.OnDestroy();
+            if (axiBtnTypeList != null)
+            {
+                handles = new AxiInputUGUIHandle[axiBtnTypeList.Length];
+                for (int i = 0; i < axiBtnTypeList.Length; i++)
+                {
+                    handles[i].Dispose();
+                    handles[i] = null;
+                }
+                axiBtnTypeList = null;
+                handles = null;
+            }
+
+        }
+        protected override void OnEnable()
+        {
+            base.OnEnable();
+        }
+
+        bool GetKey()
+        {
+            return m_state >= AxiButtonState.KeyDown;
+        }
+        bool GetKeyUp()
+        {
+            return m_state == AxiButtonState.KeyUp;
+        }
+        bool GetKeyDown()
+        {
+            return m_state == AxiButtonState.KeyDown;
+        }
+
+        public override void OnPointerDown(PointerEventData eventData)
+        {
+            base.OnPointerDown(eventData);
+            //如果之前帧是KeyUp或None,则为KeyDown|KeyHold
+            if (m_state <= AxiButtonState.KeyUp)
+                m_state = AxiButtonState.KeyDown;
+            //如果之前帧是KeyDown,则为KeyHold
+            else if (m_state == AxiButtonState.KeyDown)
+                m_state = AxiButtonState.KeyHold;
+        }
+        public override void OnPointerUp(PointerEventData eventData)
+        {
+            base.OnPointerUp(eventData);
+            //如果之前帧是KeyDown|KeyHold,则为KeyUp|None
+            if (m_state >= AxiButtonState.KeyDown)
+                m_state = AxiButtonState.KeyUp;
+            //如果之前帧是KeyUp,则为None
+            else if (m_state == AxiButtonState.KeyUp)
+                m_state = AxiButtonState.None;
+        }
+    }
+}
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/NesEmulator/NesControllerMapper.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/NesEmulator/NesControllerMapper.cs
index 71bea9b2..c50b8f8b 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/NesEmulator/NesControllerMapper.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/NesEmulator/NesControllerMapper.cs
@@ -201,27 +201,27 @@ namespace AxibugEmuOnline.Client
                 //    MIC.IsDown;
             }
 
-            public static KeyListener GetKey(int controllerInput, EnumButtonType nesConBtnType)
-            {
-                string configKey = $"NES_{controllerInput}_{nesConBtnType}";
+            //public static KeyListener GetKey(int controllerInput, EnumButtonType nesConBtnType)
+            //{
+            //    string configKey = $"NES_{controllerInput}_{nesConBtnType}";
 
-                //PSV平台固定键值
-                if (UnityEngine.Application.platform == RuntimePlatform.PSP2)
-                {
-                    return KeyListener.GetPSVitaKey(controllerInput, nesConBtnType);
-                }
+            //    //PSV平台固定键值
+            //    if (UnityEngine.Application.platform == RuntimePlatform.PSP2)
+            //    {
+            //        return KeyListener.GetPSVitaKey(controllerInput, nesConBtnType);
+            //    }
 
-                if (PlayerPrefs.HasKey(configKey))
-                {
-                    return new KeyListener(PlayerPrefs.GetString(configKey));
-                }
-                else
-                {
-                    var defaultKeyCode = KeyListener.GetDefaultKey(controllerInput, nesConBtnType);
-                    PlayerPrefs.SetString(configKey, defaultKeyCode.ToString());
-                    return defaultKeyCode;
-                }
-            }
+            //    if (PlayerPrefs.HasKey(configKey))
+            //    {
+            //        return new KeyListener(PlayerPrefs.GetString(configKey));
+            //    }
+            //    else
+            //    {
+            //        var defaultKeyCode = KeyListener.GetDefaultKey(controllerInput, nesConBtnType);
+            //        PlayerPrefs.SetString(configKey, defaultKeyCode.ToString());
+            //        return defaultKeyCode;
+            //    }
+            //}
         }
 
         ///// <summary>
@@ -268,127 +268,127 @@ namespace AxibugEmuOnline.Client
         //low C# readonly
         //public readonly struct KeyListener
 
-        public struct KeyListener
-        {
-            private readonly KeyCode m_key;
+        //public struct KeyListener
+        //{
+        //    private readonly KeyCode m_key;
 
-            public KeyListener(KeyCode key)
-            {
-                m_key = key;
-            }
+        //    public KeyListener(KeyCode key)
+        //    {
+        //        m_key = key;
+        //    }
 
-            /// <summary> 从配置字符串构建 </summary>
-            public KeyListener(string confStr)
-            {
-                m_key = KeyCode.None;
+        //    /// <summary> 从配置字符串构建 </summary>
+        //    public KeyListener(string confStr)
+        //    {
+        //        m_key = KeyCode.None;
 
-                int result;
-                if (int.TryParse(confStr, out result))
-                    m_key = (KeyCode)result;
-            }
+        //        int result;
+        //        if (int.TryParse(confStr, out result))
+        //            m_key = (KeyCode)result;
+        //    }
 
-            public bool IsPressing()
-            {
-                return Input.GetKey(m_key);
-            }
-            public bool IsDown()
-            {
-                return Input.GetKeyDown(m_key);
-            }
+        //    public bool IsPressing()
+        //    {
+        //        return Input.GetKey(m_key);
+        //    }
+        //    public bool IsDown()
+        //    {
+        //        return Input.GetKeyDown(m_key);
+        //    }
 
-            public override string ToString()
-            {
-                return ((int)(m_key)).ToString();
-            }
+        //    public override string ToString()
+        //    {
+        //        return ((int)(m_key)).ToString();
+        //    }
 
-            public static KeyListener GetDefaultKey(int controllerIndex, EnumButtonType nesConBtnType)
-            {
-                switch (controllerIndex)
-                {
-                    case 0:
-                        switch (nesConBtnType)
-                        {
-                            case EnumButtonType.LEFT:
-                                return new KeyListener(KeyCode.A);
-                            case EnumButtonType.RIGHT:
-                                return new KeyListener(KeyCode.D);
-                            case EnumButtonType.UP:
-                                return new KeyListener(KeyCode.W);
-                            case EnumButtonType.DOWN:
-                                return new KeyListener(KeyCode.S);
-                            case EnumButtonType.START:
-                                return new KeyListener(KeyCode.B);
-                            case EnumButtonType.SELECT:
-                                return new KeyListener(KeyCode.V);
-                            case EnumButtonType.A:
-                                return new KeyListener(KeyCode.K);
-                            case EnumButtonType.B:
-                                return new KeyListener(KeyCode.J);
-                            case EnumButtonType.MIC:
-                                return new KeyListener(KeyCode.M);
-                        }
+        //    public static KeyListener GetDefaultKey(int controllerIndex, EnumButtonType nesConBtnType)
+        //    {
+        //        switch (controllerIndex)
+        //        {
+        //            case 0:
+        //                switch (nesConBtnType)
+        //                {
+        //                    case EnumButtonType.LEFT:
+        //                        return new KeyListener(KeyCode.A);
+        //                    case EnumButtonType.RIGHT:
+        //                        return new KeyListener(KeyCode.D);
+        //                    case EnumButtonType.UP:
+        //                        return new KeyListener(KeyCode.W);
+        //                    case EnumButtonType.DOWN:
+        //                        return new KeyListener(KeyCode.S);
+        //                    case EnumButtonType.START:
+        //                        return new KeyListener(KeyCode.B);
+        //                    case EnumButtonType.SELECT:
+        //                        return new KeyListener(KeyCode.V);
+        //                    case EnumButtonType.A:
+        //                        return new KeyListener(KeyCode.K);
+        //                    case EnumButtonType.B:
+        //                        return new KeyListener(KeyCode.J);
+        //                    case EnumButtonType.MIC:
+        //                        return new KeyListener(KeyCode.M);
+        //                }
 
-                        break;
-                    case 1:
-                        switch (nesConBtnType)
-                        {
-                            case EnumButtonType.LEFT:
-                                return new KeyListener(KeyCode.Delete);
-                            case EnumButtonType.RIGHT:
-                                return new KeyListener(KeyCode.PageDown);
-                            case EnumButtonType.UP:
-                                return new KeyListener(KeyCode.Home);
-                            case EnumButtonType.DOWN:
-                                return new KeyListener(KeyCode.End);
-                            case EnumButtonType.START:
-                                return new KeyListener(KeyCode.PageUp);
-                            case EnumButtonType.SELECT:
-                                return new KeyListener(KeyCode.Insert);
-                            case EnumButtonType.A:
-                                return new KeyListener(KeyCode.Keypad5);
-                            case EnumButtonType.B:
-                                return new KeyListener(KeyCode.Keypad4);
-                            case EnumButtonType.MIC:
-                                return new KeyListener(KeyCode.KeypadPeriod);
-                        }
+        //                break;
+        //            case 1:
+        //                switch (nesConBtnType)
+        //                {
+        //                    case EnumButtonType.LEFT:
+        //                        return new KeyListener(KeyCode.Delete);
+        //                    case EnumButtonType.RIGHT:
+        //                        return new KeyListener(KeyCode.PageDown);
+        //                    case EnumButtonType.UP:
+        //                        return new KeyListener(KeyCode.Home);
+        //                    case EnumButtonType.DOWN:
+        //                        return new KeyListener(KeyCode.End);
+        //                    case EnumButtonType.START:
+        //                        return new KeyListener(KeyCode.PageUp);
+        //                    case EnumButtonType.SELECT:
+        //                        return new KeyListener(KeyCode.Insert);
+        //                    case EnumButtonType.A:
+        //                        return new KeyListener(KeyCode.Keypad5);
+        //                    case EnumButtonType.B:
+        //                        return new KeyListener(KeyCode.Keypad4);
+        //                    case EnumButtonType.MIC:
+        //                        return new KeyListener(KeyCode.KeypadPeriod);
+        //                }
 
-                        break;
-                }
+        //                break;
+        //        }
 
-                return default(KeyListener);
-            }
+        //        return default(KeyListener);
+        //    }
 
 
-            public static KeyListener GetPSVitaKey(int controllerIndex, EnumButtonType nesConBtnType)
-            {
-                switch (controllerIndex)
-                {
-                    case 0:
-                        switch (nesConBtnType)
-                        {
-                            case EnumButtonType.LEFT:
-                                return new KeyListener(PSVitaKey.Left);
-                            case EnumButtonType.RIGHT:
-                                return new KeyListener(PSVitaKey.Right);
-                            case EnumButtonType.UP:
-                                return new KeyListener(PSVitaKey.Up);
-                            case EnumButtonType.DOWN:
-                                return new KeyListener(PSVitaKey.Down);
-                            case EnumButtonType.START:
-                                return new KeyListener(PSVitaKey.Start);
-                            case EnumButtonType.SELECT:
-                                return new KeyListener(PSVitaKey.Select);
-                            case EnumButtonType.A:
-                                return new KeyListener(PSVitaKey.Circle);
-                            case EnumButtonType.B:
-                                return new KeyListener(PSVitaKey.Cross);
-                            case EnumButtonType.MIC:
-                                return new KeyListener(PSVitaKey.Block);
-                        }
-                        break;
-                }
-                return default(KeyListener);
-            }
-        }
+        //    //public static KeyListener GetPSVitaKey(int controllerIndex, EnumButtonType nesConBtnType)
+        //    //{
+        //    //    switch (controllerIndex)
+        //    //    {
+        //    //        case 0:
+        //    //            switch (nesConBtnType)
+        //    //            {
+        //    //                case EnumButtonType.LEFT:
+        //    //                    return new KeyListener(PSVitaKey.Left);
+        //    //                case EnumButtonType.RIGHT:
+        //    //                    return new KeyListener(PSVitaKey.Right);
+        //    //                case EnumButtonType.UP:
+        //    //                    return new KeyListener(PSVitaKey.Up);
+        //    //                case EnumButtonType.DOWN:
+        //    //                    return new KeyListener(PSVitaKey.Down);
+        //    //                case EnumButtonType.START:
+        //    //                    return new KeyListener(PSVitaKey.Start);
+        //    //                case EnumButtonType.SELECT:
+        //    //                    return new KeyListener(PSVitaKey.Select);
+        //    //                case EnumButtonType.A:
+        //    //                    return new KeyListener(PSVitaKey.Circle);
+        //    //                case EnumButtonType.B:
+        //    //                    return new KeyListener(PSVitaKey.Cross);
+        //    //                case EnumButtonType.MIC:
+        //    //                    return new KeyListener(PSVitaKey.Block);
+        //    //            }
+        //    //            break;
+        //    //    }
+        //    //    return default(KeyListener);
+        //    //}
+        //}
     }
 }
\ No newline at end of file
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/IkeyMapperChanger/GamingChanger.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/IkeyMapperChanger/GamingChanger.cs
index 4a632405..0029e267 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/IkeyMapperChanger/GamingChanger.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/IkeyMapperChanger/GamingChanger.cs
@@ -1,7 +1,5 @@
-using Assets.Script.AppMain.AxiInput.Settings;
-using AxibugEmuOnline.Client.ClientCore;
+using AxibugEmuOnline.Client.ClientCore;
 using AxibugEmuOnline.Client.Manager;
-using System;
 
 namespace AxibugEmuOnline.Client
 {
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/IkeyMapperChanger/NormalChanger.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/IkeyMapperChanger/NormalChanger.cs
index bdf6c2b1..bba6c35f 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/IkeyMapperChanger/NormalChanger.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/IkeyMapperChanger/NormalChanger.cs
@@ -1,7 +1,5 @@
-using Assets.Script.AppMain.AxiInput.Settings;
-using AxibugEmuOnline.Client.ClientCore;
+using AxibugEmuOnline.Client.ClientCore;
 using AxibugEmuOnline.Client.Manager;
-using System;
 
 namespace AxibugEmuOnline.Client
 {
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppInput.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppInput.cs
index aa204a7a..1bde885a 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppInput.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppInput.cs
@@ -1,11 +1,9 @@
-using Assets.Script.AppMain.AxiInput;
-using Assets.Script.AppMain.AxiInput.Settings;
-using AxibugEmuOnline.Client.Common;
+using AxibugEmuOnline.Client.Common;
+using AxiInputSP;
+using AxiInputSP.Setting;
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using UnityEngine;
-using UnityEngine.UIElements.Experimental;
 
 namespace AxibugEmuOnline.Client.Manager
 {
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/CommandDispatcher/CommandListener.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/CommandDispatcher/CommandListener.cs
index 2be86f8a..54bb040c 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/CommandDispatcher/CommandListener.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/CommandDispatcher/CommandListener.cs
@@ -1,11 +1,8 @@
-using Assets.Script.AppMain.AxiInput;
-using AxibugEmuOnline.Client.ClientCore;
+using AxibugEmuOnline.Client.ClientCore;
 using AxibugEmuOnline.Client.Manager;
-using System.CodeDom.Compiler;
 using System.Collections.Generic;
 using System.Linq;
 using UnityEngine;
-using static UnityEditor.Progress;
 
 namespace AxibugEmuOnline.Client
 {