From 228089a2e1a793f8d6185d161ec61b53b1c13e55 Mon Sep 17 00:00:00 2001 From: DAIKI Date: Fri, 12 Jul 2024 16:57:03 +0900 Subject: [PATCH 1/7] Match capabilities.userIndex with GamepadIndex to detect hijacked gamepads. --- .../Assets/Samples/Sample.cs | 2 + .../Scripts/SteamInputAdapter.cs | 58 +++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/UnitySteamInputAdapter/Assets/Samples/Sample.cs b/UnitySteamInputAdapter/Assets/Samples/Sample.cs index e1434db..4464e81 100644 --- a/UnitySteamInputAdapter/Assets/Samples/Sample.cs +++ b/UnitySteamInputAdapter/Assets/Samples/Sample.cs @@ -12,10 +12,12 @@ public class Sample : MonoBehaviour private void Awake() { SteamAPI.Init(); + SteamInput.Init(false); } private void OnDestroy() { + SteamInput.Shutdown(); SteamAPI.Shutdown(); } diff --git a/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs b/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs index 59cbcd4..b9a04a6 100644 --- a/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs +++ b/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs @@ -1,5 +1,6 @@ #if SUPPORT_INPUTSYSTEM && SUPPORT_STEAMWORKS && !DISABLESTEAMWORKS using Steamworks; +using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.InputSystem.DualShock; using UnityEngine.InputSystem.Switch; @@ -81,6 +82,11 @@ public static EInputActionOrigin GetSteamInputAction(InputDevice inputDevice, st /// Steam InputType. If conversion fails, is returned. public static ESteamInputType GetSteamInputDevice(InputDevice inputDevice) { + if (TryGetHijackedSteamInputDevice(inputDevice, out var result)) + { + return result; + } + switch (inputDevice) { case XInputController: @@ -103,6 +109,58 @@ public static ESteamInputType GetSteamInputDevice(InputDevice inputDevice) } } + private static readonly InputHandle_t[] InputHandleBuffer = new InputHandle_t[Constants.STEAM_INPUT_MAX_COUNT]; + + [System.Serializable] + private class Capabilities + { + public int userIndex = -1; + } + + /// + /// If the user enables Steam Input, all gamepads will be overridden to XInput. + /// This function retrieves the type of gamepad before it is overridden. + /// + public static bool TryGetHijackedSteamInputDevice(InputDevice inputDevice, out ESteamInputType result) + { + if (inputDevice is not XInputController) + { + result = ESteamInputType.k_ESteamInputType_Unknown; + return false; + } + + var steamDeviceCount = SteamInput.GetConnectedControllers(InputHandleBuffer); + if (steamDeviceCount == 0) + { + result = ESteamInputType.k_ESteamInputType_Unknown; + return false; + } + + var capabilities = inputDevice.description.capabilities; + if (string.IsNullOrEmpty(capabilities)) + { + result = ESteamInputType.k_ESteamInputType_Unknown; + return false; + } + var capabilitiesValue = JsonUtility.FromJson(capabilities); + if (capabilitiesValue.userIndex >= 0) + { + for (int i = 0; i < steamDeviceCount; i++) + { + var inputHandle = InputHandleBuffer[i]; + var steamDeviceIndex = SteamInput.GetGamepadIndexForController(inputHandle); + if (steamDeviceIndex == capabilitiesValue.userIndex) + { + result = SteamInput.GetInputTypeForHandle(inputHandle); + return true; + } + } + } + + result = ESteamInputType.k_ESteamInputType_Unknown; + return false; + } + /// /// Get SteamInputActionOrigin from UnityInputControl for input translation. /// Result is almost like XInput. From ae0313c9e5a32b5e29200306bd51d76177fb2290 Mon Sep 17 00:00:00 2001 From: DAIKI Date: Fri, 12 Jul 2024 17:11:27 +0900 Subject: [PATCH 2/7] Refactoring invalid value --- .../UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs b/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs index b9a04a6..12ef529 100644 --- a/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs +++ b/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs @@ -114,7 +114,8 @@ public static ESteamInputType GetSteamInputDevice(InputDevice inputDevice) [System.Serializable] private class Capabilities { - public int userIndex = -1; + public const int InvalidValue = -1; + public int userIndex = InvalidValue; } /// @@ -143,7 +144,7 @@ public static bool TryGetHijackedSteamInputDevice(InputDevice inputDevice, out E return false; } var capabilitiesValue = JsonUtility.FromJson(capabilities); - if (capabilitiesValue.userIndex >= 0) + if (capabilitiesValue.userIndex != Capabilities.InvalidValue) { for (int i = 0; i < steamDeviceCount; i++) { From adb653f0dc01ebb68a931c3cb85594662bffa2ca Mon Sep 17 00:00:00 2001 From: DAIKI Date: Fri, 12 Jul 2024 17:14:30 +0900 Subject: [PATCH 3/7] Add try catch --- .../Scripts/SteamInputAdapter.cs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs b/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs index 12ef529..fed81f0 100644 --- a/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs +++ b/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs @@ -1,4 +1,5 @@ #if SUPPORT_INPUTSYSTEM && SUPPORT_STEAMWORKS && !DISABLESTEAMWORKS +using System; using Steamworks; using UnityEngine; using UnityEngine.InputSystem; @@ -111,7 +112,7 @@ public static ESteamInputType GetSteamInputDevice(InputDevice inputDevice) private static readonly InputHandle_t[] InputHandleBuffer = new InputHandle_t[Constants.STEAM_INPUT_MAX_COUNT]; - [System.Serializable] + [Serializable] private class Capabilities { public const int InvalidValue = -1; @@ -143,8 +144,20 @@ public static bool TryGetHijackedSteamInputDevice(InputDevice inputDevice, out E result = ESteamInputType.k_ESteamInputType_Unknown; return false; } - var capabilitiesValue = JsonUtility.FromJson(capabilities); - if (capabilitiesValue.userIndex != Capabilities.InvalidValue) + + Capabilities capabilitiesValue; + try + { + capabilitiesValue = JsonUtility.FromJson(capabilities); + } + catch (Exception e) + { + Debug.LogException(e); + result = ESteamInputType.k_ESteamInputType_Unknown; + return false; + } + + if (capabilities != null && capabilitiesValue.userIndex != Capabilities.InvalidValue) { for (int i = 0; i < steamDeviceCount; i++) { From b9e8ca6ebb446543e2b04cb1d83d1059f6d64b0b Mon Sep 17 00:00:00 2001 From: DAIKI Date: Sat, 13 Jul 2024 14:30:03 +0900 Subject: [PATCH 4/7] Add remarks comment --- .../UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs b/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs index fed81f0..02db280 100644 --- a/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs +++ b/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs @@ -123,6 +123,11 @@ private class Capabilities /// If the user enables Steam Input, all gamepads will be overridden to XInput. /// This function retrieves the type of gamepad before it is overridden. /// + /// + /// If multiple gamepads are connected, the type of gamepad returned by this function might be swapped. + /// Only Steam can improve this, and there is nothing that Unity or we can do about it. + /// Users can resolve this issue by disabling Steam Input. Alternatively, restarting the game or unplugging and replugging all the gamepads may solve the problem. + /// public static bool TryGetHijackedSteamInputDevice(InputDevice inputDevice, out ESteamInputType result) { if (inputDevice is not XInputController) From afb802291db3d9426a232771581d8d77af07f95e Mon Sep 17 00:00:00 2001 From: DAIKI Date: Sat, 13 Jul 2024 15:10:16 +0900 Subject: [PATCH 5/7] Change version and changelog --- .../Assets/UnitySteamInputAdapter/CHANGELOG.md | 4 ++++ .../Assets/UnitySteamInputAdapter/package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/CHANGELOG.md b/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/CHANGELOG.md index 3488e6a..ae2e6be 100644 --- a/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/CHANGELOG.md +++ b/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [1.0.0] - 2024-07-13 +### Fixed +- Fixed to recognize gamepads when the user has Steam Input enabled. + ## [0.9.2] - 2024-07-03 ### Added - Convert steam input action from control path. diff --git a/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/package.json b/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/package.json index 60017f0..9e17b75 100644 --- a/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/package.json +++ b/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/package.json @@ -1,7 +1,7 @@ { "name": "com.eviltwo.unity-steam-input-adapter", "displayName": "Unity Steam Input Adapter", - "version": "0.9.2", + "version": "1.0.0", "unity": "2022.3", "description": "Change controller input from Unity(InputSystem) to Steam(InputAction)", "author": { From 67f85f758cd38a9d00dcc7e0e5f06b250ef74bf1 Mon Sep 17 00:00:00 2001 From: DAIKI Date: Sat, 13 Jul 2024 15:20:21 +0900 Subject: [PATCH 6/7] Add capture button for switch pro controller --- .../UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs b/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs index 02db280..b873e89 100644 --- a/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs +++ b/UnitySteamInputAdapter/Assets/UnitySteamInputAdapter/Scripts/SteamInputAdapter.cs @@ -303,6 +303,10 @@ private static EInputActionOrigin GetBaseSteamInputAction(string controlLocalPat case "touchpadButton": return EInputActionOrigin.k_EInputActionOrigin_PS5_CenterPad_Click; + // Switch Pro controls + case "capture": + return EInputActionOrigin.k_EInputActionOrigin_Switch_Capture; + default: return EInputActionOrigin.k_EInputActionOrigin_None; } From 89ffba8bf6bc5c90ec984e8c23e003b9ec6ea05a Mon Sep 17 00:00:00 2001 From: DAIKI Date: Sat, 13 Jul 2024 15:23:54 +0900 Subject: [PATCH 7/7] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fe93202..5a68902 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ Change controller input from Unity(InputSystem) to Steam(InputAction). You can g This package is useful if you want to use the InputSystem but partially use SteamInput. For example, you can generate button information to pass to `SteamInput.GetGlyphPNGForActionOrigin()`. -![image](https://github.com/eviltwo/UnitySteamInputAdapter/assets/7721151/73e78a15-4096-4467-8a72-d89027b821fb) +Check out [InputGlyphs](https://github.com/eviltwo/InputGlyphs) that use this package! -Please note that we have not tested this with all controllers. Xbox controllers and PS5 controllers have been tested. +![image](https://github.com/eviltwo/UnitySteamInputAdapter/assets/7721151/73e78a15-4096-4467-8a72-d89027b821fb) # Require packages - InputSystem (Unity)