fuck InputSystem!

This commit is contained in:
ALIENJACK\alien 2024-11-26 16:54:51 +08:00
parent 08bdb552c9
commit d7269175cd
21 changed files with 188 additions and 673 deletions

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 6178d336be6488b46aed623405e79f7b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,304 +0,0 @@
{
"name": "New Controls",
"maps": [
{
"name": "UI_Normal",
"id": "9a397a4f-4d88-492f-a918-bf9b8d3be756",
"actions": [
{
"name": "SelectItemLeft",
"type": "Button",
"id": "107019fe-240c-46ff-8c62-cb385ef8b9af",
"expectedControlType": "Button",
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "SelectItemRight",
"type": "Button",
"id": "826dd3f1-2cf8-4169-97c8-dfb56b850143",
"expectedControlType": "Button",
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "SelectItemUp",
"type": "Button",
"id": "505dabb4-91f7-430c-8696-092690269639",
"expectedControlType": "Button",
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "SelectItemDown",
"type": "Button",
"id": "b3da8633-7f50-44b3-8302-50706e589307",
"expectedControlType": "Button",
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "Enter",
"type": "Button",
"id": "0bdf3154-e1db-4044-af50-cacb3764a07c",
"expectedControlType": "Button",
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "Back",
"type": "Button",
"id": "68074d67-61a1-4a4d-bd68-8398b0e7afe3",
"expectedControlType": "Button",
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "OptionMenu",
"type": "Button",
"id": "64b67280-c530-4e38-b3ff-8d0177591396",
"expectedControlType": "Button",
"processors": "",
"interactions": "",
"initialStateCheck": false
}
],
"bindings": [
{
"name": "",
"id": "fc724bf2-7736-419c-9f46-19bd45a0d276",
"path": "<Keyboard>/a",
"interactions": "",
"processors": "",
"groups": "Keyboard",
"action": "SelectItemLeft",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "02f4433e-4417-4fef-b178-a616e2941311",
"path": "<Keyboard>/leftArrow",
"interactions": "",
"processors": "",
"groups": "Keyboard",
"action": "SelectItemLeft",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "cb874e72-d3db-4024-b9fb-37190acd9568",
"path": "<Keyboard>/d",
"interactions": "",
"processors": "",
"groups": "Keyboard",
"action": "SelectItemRight",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "646b923b-4d3d-4b5c-9dd2-0119e9d3e2c5",
"path": "<Keyboard>/rightArrow",
"interactions": "",
"processors": "",
"groups": "Keyboard",
"action": "SelectItemRight",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "28fa0139-d5a2-4e26-87af-2043e01234e6",
"path": "<Keyboard>/w",
"interactions": "",
"processors": "",
"groups": "Keyboard",
"action": "SelectItemUp",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "4474efdf-70ff-4826-883c-2fdf9f96e78e",
"path": "<Keyboard>/upArrow",
"interactions": "",
"processors": "",
"groups": "Keyboard",
"action": "SelectItemUp",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "392a8cbc-71f6-4282-b945-4c7b3d17ba3a",
"path": "<Keyboard>/s",
"interactions": "",
"processors": "",
"groups": "Keyboard",
"action": "SelectItemDown",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "f30b6fb3-147e-4997-b628-fab3f635192b",
"path": "<Keyboard>/downArrow",
"interactions": "",
"processors": "",
"groups": "Keyboard",
"action": "SelectItemDown",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "70c6db12-432b-482d-99a1-71e002c30157",
"path": "<Keyboard>/k",
"interactions": "",
"processors": "",
"groups": "Keyboard",
"action": "Enter",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "48d5c450-6ac3-40fb-8ff4-66c7f3b3a00b",
"path": "<Keyboard>/enter",
"interactions": "",
"processors": "",
"groups": "Keyboard",
"action": "Enter",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "ef83ae7c-a809-4f23-a206-102199a5ede3",
"path": "<Keyboard>/l",
"interactions": "",
"processors": "",
"groups": "Keyboard",
"action": "Back",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "14b503c8-80a1-458c-9e0f-a3fa38f314be",
"path": "<Keyboard>/backspace",
"interactions": "",
"processors": "",
"groups": "Keyboard",
"action": "Back",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "e1e12f45-fb41-4b78-adbf-add2881bd4b1",
"path": "<Keyboard>/i",
"interactions": "",
"processors": "",
"groups": "Keyboard",
"action": "OptionMenu",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "0b010e17-3581-42e6-90b1-f1bf728a3a0c",
"path": "<Keyboard>/shift",
"interactions": "",
"processors": "",
"groups": "Keyboard",
"action": "OptionMenu",
"isComposite": false,
"isPartOfComposite": false
}
]
},
{
"name": "UI_InGame",
"id": "2c8af03e-03e7-4553-81c6-dcff543cdcdc",
"actions": [
{
"name": "OptionMenu",
"type": "Button",
"id": "cab3c346-07e2-4c0c-8377-cb934dd28bd3",
"expectedControlType": "Button",
"processors": "",
"interactions": "",
"initialStateCheck": false
}
],
"bindings": [
{
"name": "",
"id": "28d4d045-1070-4ea0-be35-b5ffb1c33bcb",
"path": "<Keyboard>/escape",
"interactions": "",
"processors": "",
"groups": "Keyboard",
"action": "OptionMenu",
"isComposite": false,
"isPartOfComposite": false
}
]
}
],
"controlSchemes": [
{
"name": "Keyboard",
"bindingGroup": "Keyboard",
"devices": [
{
"devicePath": "<Keyboard>",
"isOptional": false,
"isOR": false
}
]
},
{
"name": "UniversalGamePad",
"bindingGroup": "UniversalGamePad",
"devices": [
{
"devicePath": "<Gamepad>",
"isOptional": false,
"isOR": false
}
]
},
{
"name": "Xbox Controller",
"bindingGroup": "Xbox Controller",
"devices": [
{
"devicePath": "<XInputController>",
"isOptional": false,
"isOR": false
}
]
},
{
"name": "PlayStation Controller",
"bindingGroup": "PlayStation Controller",
"devices": [
{
"devicePath": "<DualShockGamepad>",
"isOptional": false,
"isOR": false
}
]
}
]
}

View File

@ -1,14 +0,0 @@
fileFormatVersion: 2
guid: eb413fd14a8483440af9652b7e4df5e1
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3}
generateWrapperCode: 0
wrapperCodePath:
wrapperClassName:
wrapperCodeNamespace: InputSystem

View File

@ -458,6 +458,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 39557e19783acee499ace6c68549e8f8, type: 3} m_Script: {fileID: 11500000, guid: 39557e19783acee499ace6c68549e8f8, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
InputTemplate: {fileID: 0}
VideoProvider: {fileID: 4232056520112715744} VideoProvider: {fileID: 4232056520112715744}
AudioProvider: {fileID: 9003897287163669553} AudioProvider: {fileID: 9003897287163669553}
m_bPause: 0 m_bPause: 0

View File

@ -13427,7 +13427,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 4471d8231d16ba3469228e09d4cb3a81, type: 3} m_Script: {fileID: 11500000, guid: 4471d8231d16ba3469228e09d4cb3a81, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
LegacyInput: 0
--- !u!4 &1427887270 --- !u!4 &1427887270
Transform: Transform:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -13731,7 +13730,6 @@ RectTransform:
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0}
m_Children: m_Children:
- {fileID: 2073453794}
- {fileID: 1983793178} - {fileID: 1983793178}
- {fileID: 246947326} - {fileID: 246947326}
- {fileID: 1318590597} - {fileID: 1318590597}
@ -13832,99 +13830,6 @@ RectTransform:
m_CorrespondingSourceObject: {fileID: 1639091784002085428, guid: 450328d5a907c8249a60bc3980ba66f6, type: 3} m_CorrespondingSourceObject: {fileID: 1639091784002085428, guid: 450328d5a907c8249a60bc3980ba66f6, type: 3}
m_PrefabInstance: {fileID: 730698711} m_PrefabInstance: {fileID: 730698711}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
--- !u!1 &2073453793
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2073453794}
- component: {fileID: 2073453795}
m_Layer: 0
m_Name: UI_Input
m_TagString: UIInput
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &2073453794
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2073453793}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: -10799.999}
m_LocalScale: {x: 108, y: 108, z: 108}
m_Children: []
m_Father: {fileID: 1599240741}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &2073453795
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2073453793}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 62899f850307741f2a39c98a8b639597, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Actions: {fileID: -944628639613478452, guid: eb413fd14a8483440af9652b7e4df5e1, type: 3}
m_NotificationBehavior: 3
m_UIInputModule: {fileID: 74796457}
m_DeviceLostEvent:
m_PersistentCalls:
m_Calls: []
m_DeviceRegainedEvent:
m_PersistentCalls:
m_Calls: []
m_ControlsChangedEvent:
m_PersistentCalls:
m_Calls: []
m_ActionEvents:
- m_PersistentCalls:
m_Calls: []
m_ActionId: 107019fe-240c-46ff-8c62-cb385ef8b9af
m_ActionName: UI_Normal/SelectItemLeft
- m_PersistentCalls:
m_Calls: []
m_ActionId: 826dd3f1-2cf8-4169-97c8-dfb56b850143
m_ActionName: UI_Normal/SelectItemRight
- m_PersistentCalls:
m_Calls: []
m_ActionId: 505dabb4-91f7-430c-8696-092690269639
m_ActionName: UI_Normal/SelectItemUp
- m_PersistentCalls:
m_Calls: []
m_ActionId: b3da8633-7f50-44b3-8302-50706e589307
m_ActionName: UI_Normal/SelectItemDown
- m_PersistentCalls:
m_Calls: []
m_ActionId: 0bdf3154-e1db-4044-af50-cacb3764a07c
m_ActionName: UI_Normal/Enter
- m_PersistentCalls:
m_Calls: []
m_ActionId: 68074d67-61a1-4a4d-bd68-8398b0e7afe3
m_ActionName: UI_Normal/Back
- m_PersistentCalls:
m_Calls: []
m_ActionId: 64b67280-c530-4e38-b3ff-8d0177591396
m_ActionName: UI_Normal/OptionMenu
- m_PersistentCalls:
m_Calls: []
m_ActionId: cab3c346-07e2-4c0c-8377-cb934dd28bd3
m_ActionName: UI_InGame/OptionMenu
m_NeverAutoSwitchControlSchemes: 0
m_DefaultControlScheme: Keyboard
m_DefaultActionMap: UI_Normal
m_SplitScreenIndex: -1
m_Camera: {fileID: 0}
--- !u!1001 &1963501580473600373 --- !u!1001 &1963501580473600373
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

View File

@ -5,7 +5,6 @@ using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
using UnityEngine; using UnityEngine;
using UnityEngine.Networking; using UnityEngine.Networking;
using UnityEngine.Scripting;
using static AxibugEmuOnline.Client.HttpAPI; using static AxibugEmuOnline.Client.HttpAPI;
using static AxibugEmuOnline.Client.Manager.LogManager; using static AxibugEmuOnline.Client.Manager.LogManager;
@ -38,11 +37,6 @@ namespace AxibugEmuOnline.Client.ClientCore
#else #else
public static string PersistentDataPath => Application.persistentDataPath; public static string PersistentDataPath => Application.persistentDataPath;
#endif #endif
//[Preserve]
//[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)]
public static void Init() public static void Init()
{ {
settings = new AppSettings(); settings = new AppSettings();

View File

@ -15,6 +15,7 @@ namespace AxibugEmuOnline.Client
void SetupScheme(); void SetupScheme();
void StartGame(RomFile romFile); void StartGame(RomFile romFile);
void DoReset(); void DoReset();
EnumPlatform Platform { get; }
uint Frame { get; } uint Frame { get; }
} }

View File

@ -1,10 +0,0 @@
namespace AxibugEmuOnline.Client
{
public class GamingChanger : CommandChanger
{
public override object GetConfig()
{
return "UI_InGame";
}
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: e5b6687e9412f174d82b2c15f1efc4a4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,10 +0,0 @@
namespace AxibugEmuOnline.Client
{
public class NormalChanger : CommandChanger
{
public override object GetConfig()
{
return "UI_Normal";
}
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 8aa965a6a15aa1a4195977111b1ec13b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,5 +1,4 @@
using AxibugEmuOnline.Client.ClientCore; using AxibugEmuOnline.Client.ClientCore;
using AxiReplay;
using System; using System;
using System.IO; using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
@ -57,7 +56,7 @@ namespace AxibugEmuOnline.Client
} }
public EmulatorConfig Config { get; private set; } = new EmulatorConfig(); public EmulatorConfig Config { get; private set; } = new EmulatorConfig();
public NesControllerMapper ControllerMapper { get; private set; } = new NesControllerMapper();
public void PrepareDirectory(string directPath) public void PrepareDirectory(string directPath)
{ {
Directory.CreateDirectory($"{App.PersistentDataPath}/{directPath}"); Directory.CreateDirectory($"{App.PersistentDataPath}/{directPath}");
@ -115,7 +114,7 @@ namespace AxibugEmuOnline.Client
} }
else m_sampledState = default; else m_sampledState = default;
var localState = NesControllerMapper.Get().CreateState(); var localState = ControllerMapper.CreateState();
var rawData = ToNet(localState); var rawData = ToNet(localState);
if (LastTestInput != rawData) if (LastTestInput != rawData)
{ {
@ -126,7 +125,7 @@ namespace AxibugEmuOnline.Client
} }
else else
{ {
m_sampledState = NesControllerMapper.Get().CreateState(); m_sampledState = ControllerMapper.CreateState();
} }
} }

View File

@ -1,6 +1,5 @@
using AxibugEmuOnline.Client.ClientCore; using System;
using System; using System.Text;
using System.IO;
using UnityEngine; using UnityEngine;
using VirtualNes.Core; using VirtualNes.Core;
@ -8,36 +7,10 @@ namespace AxibugEmuOnline.Client
{ {
public class NesControllerMapper public class NesControllerMapper
{ {
private static readonly string ConfigFilePath = $"{App.PersistentDataPath}/NES/ControllerMapper.json"; public MapperSetter Player1 = new MapperSetter(1);
public MapperSetter Player2 = new MapperSetter(2);
public MapperSetter Player1 = new MapperSetter(); public MapperSetter Player3 = new MapperSetter(3);
public MapperSetter Player2 = new MapperSetter(); public MapperSetter Player4 = new MapperSetter(4);
public MapperSetter Player3 = new MapperSetter();
public MapperSetter Player4 = new MapperSetter();
public NesControllerMapper()
{
Player1.UP.keyCode = KeyCode.W;
Player1.DOWN.keyCode = KeyCode.S;
Player1.LEFT.keyCode = KeyCode.A;
Player1.RIGHT.keyCode = KeyCode.D;
Player1.B.keyCode = KeyCode.J;
Player1.A.keyCode = KeyCode.K;
Player1.SELECT.keyCode = KeyCode.V;
Player1.START.keyCode = KeyCode.B;
//PC XBOX
//Player1.B.keyCode = Common.PC_XBOXKEY.A;
//Player1.A.keyCode = Common.PC_XBOXKEY.B;
//Player1.SELECT.keyCode = Common.PC_XBOXKEY.ViewBtn;
//Player1.START.keyCode = Common.PC_XBOXKEY.MenuBtn;
}
public void Save()
{
var jsonStr = JsonUtility.ToJson(this);
File.WriteAllText(ConfigFilePath, jsonStr);
}
public ControllerState CreateState() public ControllerState CreateState()
{ {
@ -46,86 +19,189 @@ namespace AxibugEmuOnline.Client
var state3 = Player3.GetButtons(); var state3 = Player3.GetButtons();
var state4 = Player4.GetButtons(); var state4 = Player4.GetButtons();
return new ControllerState(state1, state2, state3, state4); var result = new ControllerState(state1, state2, state3, state4);
return result;
} }
private static NesControllerMapper s_setting;
public static NesControllerMapper Get()
{
if (s_setting == null)
{
try
{
var json = File.ReadAllText($"{App.PersistentDataPath}/Nes/ControllerMapper.json");
s_setting = JsonUtility.FromJson<NesControllerMapper>(json);
}
catch
{
s_setting = new NesControllerMapper();
}
}
return s_setting;
}
[Serializable]
public class Mapper public class Mapper
{ {
public EnumButtonType buttonType; MapperSetter m_setter;
public KeyCode keyCode; EnumButtonType m_buttonType;
IKeyListener m_keyListener;
int m_controllerIndex => m_setter.ControllerIndex;
public Mapper(EnumButtonType buttonType) public Mapper(MapperSetter setter, EnumButtonType buttonType)
{ {
this.buttonType = buttonType; m_setter = setter;
m_buttonType = buttonType;
loadConfig();
}
private void loadConfig()
{
m_keyListener = MapperSetter.GetKey_Legacy(m_controllerIndex, m_buttonType);
}
public EnumButtonType SampleKey()
{
return m_keyListener.IsPressing() ? m_buttonType : 0;
} }
} }
[Serializable]
public class MapperSetter public class MapperSetter
{ {
public Mapper UP = new Mapper(EnumButtonType.UP); /// <summary> 控制器序号(手柄1,2,3,4) </summary>
public Mapper DOWN = new Mapper(EnumButtonType.DOWN); public int ControllerIndex { get; }
public Mapper LEFT = new Mapper(EnumButtonType.LEFT); public Mapper UP { get; private set; }
public Mapper RIGHT = new Mapper(EnumButtonType.RIGHT); public Mapper DOWN { get; private set; }
public Mapper A = new Mapper(EnumButtonType.A); public Mapper LEFT { get; private set; }
public Mapper B = new Mapper(EnumButtonType.B); public Mapper RIGHT { get; private set; }
public Mapper SELECT = new Mapper(EnumButtonType.SELECT); public Mapper A { get; private set; }
public Mapper START = new Mapper(EnumButtonType.START); public Mapper B { get; private set; }
public Mapper MIC = new Mapper(EnumButtonType.MIC); public Mapper SELECT { get; private set; }
public Mapper START { get; private set; }
public Mapper MIC { get; private set; }
public MapperSetter(int controllerIndex)
{
ControllerIndex = controllerIndex;
UP = new Mapper(this, EnumButtonType.UP);
DOWN = new Mapper(this, EnumButtonType.DOWN);
LEFT = new Mapper(this, EnumButtonType.LEFT);
RIGHT = new Mapper(this, EnumButtonType.RIGHT);
A = new Mapper(this, EnumButtonType.A);
B = new Mapper(this, EnumButtonType.B);
SELECT = new Mapper(this, EnumButtonType.SELECT);
START = new Mapper(this, EnumButtonType.START);
MIC = new Mapper(this, EnumButtonType.MIC);
}
public EnumButtonType GetButtons() public EnumButtonType GetButtons()
{ {
EnumButtonType res = 0; EnumButtonType res = 0;
if (Input.GetKey(UP.keyCode)) res |= UP.SampleKey();
res |= EnumButtonType.UP; res |= DOWN.SampleKey();
res |= LEFT.SampleKey();
if (Input.GetKey(DOWN.keyCode)) res |= RIGHT.SampleKey();
res |= EnumButtonType.DOWN; res |= A.SampleKey();
res |= B.SampleKey();
if (Input.GetKey(LEFT.keyCode)) res |= SELECT.SampleKey();
res |= EnumButtonType.LEFT; res |= START.SampleKey();
res |= MIC.SampleKey();
if (Input.GetKey(RIGHT.keyCode))
res |= EnumButtonType.RIGHT;
if (Input.GetKey(A.keyCode))
res |= EnumButtonType.A;
if (Input.GetKey(B.keyCode))
res |= EnumButtonType.B;
if (Input.GetKey(SELECT.keyCode))
res |= EnumButtonType.SELECT;
if (Input.GetKey(START.keyCode))
res |= EnumButtonType.START;
if (Input.GetKey(MIC.keyCode))
res |= EnumButtonType.MIC;
return res; return res;
} }
public static IKeyListener GetKey_Legacy(int controllerInput, EnumButtonType nesConBtnType)
{
string configKey = $"NES_{controllerInput}_{nesConBtnType}";
if (PlayerPrefs.HasKey(configKey))
{
return new KeyListener_Legacy(PlayerPrefs.GetString(configKey));
}
else
{
var defaultKeyCode = GetDefaultKey();
PlayerPrefs.SetString(configKey, defaultKeyCode.ToString());
return defaultKeyCode;
}
KeyListener_Legacy GetDefaultKey()
{
switch (controllerInput)
{
case 1:
if (nesConBtnType == EnumButtonType.LEFT) return new KeyListener_Legacy(KeyCode.A, KeyCode.Joystick1Button12);
if (nesConBtnType == EnumButtonType.RIGHT) return new KeyListener_Legacy(KeyCode.D, KeyCode.Joystick1Button13);
if (nesConBtnType == EnumButtonType.UP) return new KeyListener_Legacy(KeyCode.W, KeyCode.Joystick1Button10);
if (nesConBtnType == EnumButtonType.DOWN) return new KeyListener_Legacy(KeyCode.S, KeyCode.Joystick1Button11);
if (nesConBtnType == EnumButtonType.START) return new KeyListener_Legacy(KeyCode.B, KeyCode.Joystick1Button7);
if (nesConBtnType == EnumButtonType.SELECT) return new KeyListener_Legacy(KeyCode.V, KeyCode.Joystick1Button6);
if (nesConBtnType == EnumButtonType.A) return new KeyListener_Legacy(KeyCode.K, KeyCode.Joystick1Button1);
if (nesConBtnType == EnumButtonType.B) return new KeyListener_Legacy(KeyCode.J, KeyCode.Joystick1Button2);
if (nesConBtnType == EnumButtonType.MIC) return new KeyListener_Legacy(KeyCode.M, KeyCode.Joystick1Button12);
break;
case 2:
if (nesConBtnType == EnumButtonType.LEFT) return new KeyListener_Legacy(KeyCode.Delete, KeyCode.Joystick2Button12);
if (nesConBtnType == EnumButtonType.RIGHT) return new KeyListener_Legacy(KeyCode.PageDown, KeyCode.Joystick2Button13);
if (nesConBtnType == EnumButtonType.UP) return new KeyListener_Legacy(KeyCode.Home, KeyCode.Joystick2Button10);
if (nesConBtnType == EnumButtonType.DOWN) return new KeyListener_Legacy(KeyCode.End, KeyCode.Joystick2Button11);
if (nesConBtnType == EnumButtonType.START) return new KeyListener_Legacy(KeyCode.PageUp, KeyCode.Joystick2Button7);
if (nesConBtnType == EnumButtonType.SELECT) return new KeyListener_Legacy(KeyCode.Insert, KeyCode.Joystick2Button6);
if (nesConBtnType == EnumButtonType.A) return new KeyListener_Legacy(KeyCode.Keypad5, KeyCode.Joystick2Button1);
if (nesConBtnType == EnumButtonType.B) return new KeyListener_Legacy(KeyCode.Keypad4, KeyCode.Joystick2Button2);
if (nesConBtnType == EnumButtonType.MIC) return new KeyListener_Legacy(KeyCode.KeypadPeriod, KeyCode.Joystick2Button12);
break;
}
return default;
}
}
}
public interface IKeyListener
{
bool IsPressing();
}
public struct KeyListener_Legacy : IKeyListener
{
private KeyCode[] m_keys;
public KeyListener_Legacy(params KeyCode[] keys)
{
m_keys = keys;
}
/// <summary>
/// 从配置表字符串构建
/// </summary>
/// <param name="confStr">以:分割的键值字符串</param>
public KeyListener_Legacy(string confStr)
{
m_keys = new KeyCode[2];
var temp = confStr.Split(':');
m_keys = new KeyCode[temp.Length];
for (int i = 0; i < temp.Length; i++)
{
if (int.TryParse(temp[i], out int result))
m_keys[i] = (KeyCode)result;
}
}
public bool IsPressing()
{
if (m_keys == null || m_keys.Length == 0) return false;
foreach (var key in m_keys)
{
if (Input.GetKey(key)) return true;
}
return false;
}
public override string ToString()
{
if (m_keys == null || m_keys.Length == 0) return string.Empty;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < m_keys.Length; i++)
{
var keyVal = (int)m_keys[i];
sb.Append(keyVal);
if (i != m_keys.Length - 1) sb.Append(':');
}
return sb.ToString();
} }
} }
} }
}

View File

@ -1,5 +1,4 @@
using AxibugEmuOnline.Client.ClientCore; using AxibugEmuOnline.Client.ClientCore;
using AxibugEmuOnline.Client.Common;
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
@ -12,6 +11,8 @@ namespace AxibugEmuOnline.Client
{ {
public class NesEmulator : MonoBehaviour, IEmuCore public class NesEmulator : MonoBehaviour, IEmuCore
{ {
public EnumPlatform Platform => EnumPlatform.NES;
//模拟器核心实例化对象 //模拟器核心实例化对象
public NES NesCore { get; private set; } public NES NesCore { get; private set; }
@ -168,6 +169,8 @@ namespace AxibugEmuOnline.Client
NesCore.LoadState(st); NesCore.LoadState(st);
} }
public uint Frame => NesCore.FrameCount;
#if UNITY_EDITOR #if UNITY_EDITOR
/// <summary> /// <summary>
/// 编辑器用 /// 编辑器用
@ -197,7 +200,5 @@ namespace AxibugEmuOnline.Client
UnityEditor.AssetDatabase.SaveAssets(); UnityEditor.AssetDatabase.SaveAssets();
} }
#endif #endif
public uint Frame => NesCore.FrameCount;
} }
} }

View File

@ -1,3 +1,4 @@
using AxibugEmuOnline.Client.ClientCore;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
@ -18,8 +19,6 @@ namespace AxibugEmuOnline.Client
/// <summary> 游戏中UI操作 </summary> /// <summary> 游戏中UI操作 </summary>
public IKeyMapperChanger Gaming { get; private set; } public IKeyMapperChanger Gaming { get; private set; }
public bool LegacyInput;
private IKeyMapperChanger m_current; private IKeyMapperChanger m_current;
public IKeyMapperChanger Current public IKeyMapperChanger Current
{ {
@ -37,23 +36,12 @@ namespace AxibugEmuOnline.Client
Instance = this; Instance = this;
//初始化command监视器 //初始化command监视器
if (LegacyInput)
m_listener = new CommandListener_Legacy(); m_listener = new CommandListener_Legacy();
else
m_listener = new CommandListener();
//初始化键位修改器 //初始化键位修改器
if (LegacyInput)
{
Normal = new NormalChanger_Legacy(); Normal = new NormalChanger_Legacy();
Gaming = new GamingChanger_Legacy(); Gaming = new GamingChanger_Legacy();
} }
else
{
Normal = new NormalChanger();
Gaming = new GamingChanger();
}
}
private void OnDestroy() private void OnDestroy()
{ {

View File

@ -49,6 +49,8 @@ namespace AxibugEmuOnline.Client
public void ExecuteCommand(EnumCommand cmd, bool cancel) public void ExecuteCommand(EnumCommand cmd, bool cancel)
{ {
if(cmd == EnumCommand.NONE) return;
if (!cancel) if (!cancel)
{ {
switch (cmd) switch (cmd)
@ -118,6 +120,7 @@ namespace AxibugEmuOnline.Client
public enum EnumCommand public enum EnumCommand
{ {
NONE,
SelectItemLeft, SelectItemLeft,
SelectItemRight, SelectItemRight,
SelectItemUp, SelectItemUp,

View File

@ -1,65 +0,0 @@
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
namespace AxibugEmuOnline.Client
{
public class CommandListener : ICommandListener
{
private PlayerInput m_uiInput;
private IEnumerable<CommandExecuter> m_executers;
public CommandListener()
{
m_uiInput = GameObject.FindGameObjectWithTag("UIInput").GetComponent<PlayerInput>();
m_uiInput.onActionTriggered += M_uiInput_onActionTriggered;
}
public void Update(IEnumerable<CommandExecuter> executer)
{
m_executers = executer;
}
private void M_uiInput_onActionTriggered(InputAction.CallbackContext obj)
{
CommandState? cs = null;
switch (obj.action.phase)
{
case InputActionPhase.Started:
cs = new CommandState { Cancel = false, Cmd = ToCommandEnum(obj.action.name) };
break;
case InputActionPhase.Canceled:
cs = new CommandState { Cancel = true, Cmd = ToCommandEnum(obj.action.name) };
break;
}
if (!cs.HasValue) return;
foreach (var exec in m_executers)
{
if (!exec.Enable) continue;
exec.ExecuteCommand(cs.Value.Cmd, cs.Value.Cancel);
}
}
public void ApplyKeyMapper(IKeyMapperChanger changer)
{
var actionMapName = (string)changer.GetConfig();
m_uiInput.SwitchCurrentActionMap(actionMapName);
}
EnumCommand ToCommandEnum(string actionName)
{
return actionName switch
{
"SelectItemLeft" => EnumCommand.SelectItemLeft,
"SelectItemRight" => EnumCommand.SelectItemRight,
"SelectItemUp" => EnumCommand.SelectItemUp,
"SelectItemDown" => EnumCommand.SelectItemDown,
"Enter" => EnumCommand.Enter,
"Back" => EnumCommand.Back,
"OptionMenu" => EnumCommand.OptionMenu,
_ => throw new Exception("Not Support Action")
};
}
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: a493da4af70f32a43b3c558d94cf23a4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -60,6 +60,7 @@ namespace VirtualNes.Core
[Flags] [Flags]
public enum EnumButtonType public enum EnumButtonType
{ {
NONE = 0,
UP = 1, UP = 1,
DOWN = 2, DOWN = 2,
LEFT = 4, LEFT = 4,

View File

@ -2,7 +2,6 @@
"dependencies": { "dependencies": {
"com.unity.2d.sprite": "1.0.0", "com.unity.2d.sprite": "1.0.0",
"com.unity.ide.visualstudio": "2.0.22", "com.unity.ide.visualstudio": "2.0.22",
"com.unity.inputsystem": "1.3.0",
"com.unity.postprocessing": "3.2.2", "com.unity.postprocessing": "3.2.2",
"com.unity.ugui": "1.0.0", "com.unity.ugui": "1.0.0",
"com.unity.modules.ai": "1.0.0", "com.unity.modules.ai": "1.0.0",

View File

@ -22,15 +22,6 @@
}, },
"url": "https://packages.unity.cn" "url": "https://packages.unity.cn"
}, },
"com.unity.inputsystem": {
"version": "1.3.0",
"depth": 0,
"source": "registry",
"dependencies": {
"com.unity.modules.uielements": "1.0.0"
},
"url": "https://packages.unity.cn"
},
"com.unity.postprocessing": { "com.unity.postprocessing": {
"version": "3.2.2", "version": "3.2.2",
"depth": 0, "depth": 0,