Unity中连接PS4有线手柄却识别为Xbox,如何正确检测手柄类型?
Unity中PS4手柄被识别为Xbox控制器的原因及解决方法
问题描述
我正尝试在Unity中检测已连接的控制器类型,当前实现代码如下:
var gamepad = Gamepad.current; var keyboard = Keyboard.current; if (gamepad == null && keyboard == null) return; // No gamepad connected. if (gamepad != null ) { print(gamepad.displayName); }已将PS4有线手柄连接至电脑,但运行游戏后,手柄被识别为Xbox Controller,这是为何?该如何正确检测手柄类型?
原因分析
- Windows系统默认会把PS4手柄映射为Xbox控制器的输入协议,这是为了兼容大多数针对Xbox手柄优化的游戏,Unity的默认输入逻辑会直接读取这个映射后的设备标识,而非手柄原生硬件信息。
- Unity的
Gamepad.current接口优先使用系统提供的设备名称,而非直接读取手柄的硬件ID,因此会显示Xbox Controller。
正确检测手柄类型的方法
1. 通过硬件ID精准识别(推荐)
利用Unity Input System提供的设备vendorId和productId来判断手柄类型,不同品牌手柄的硬件ID是固定的:
using UnityEngine; using UnityEngine.InputSystem; public class ControllerChecker : MonoBehaviour { void Update() { var gamepad = Gamepad.current; if (gamepad == null) return; InputDevice device = gamepad; // 读取硬件ID int vendorId = device.vendorId; int productId = device.productId; // 判断是否为PS4手柄(有线/无线ID不同) bool isPS4Controller = vendorId == 0x054C && (productId == 0x09CC || productId == 0x05C4); // 判断是否为Xbox手柄(以Xbox One为例) bool isXboxController = vendorId == 0x045E && (productId == 0x02EA || productId == 0x02FD); if (isPS4Controller) { Debug.Log("当前连接的是PS4手柄"); } else if (isXboxController) { Debug.Log("当前连接的是Xbox手柄"); } else { Debug.Log($"未知手柄:{gamepad.displayName}"); } } }
2. 系统层面禁用Xbox映射
如果希望系统直接识别PS4手柄原生设备,可以安装DS4Windows这类工具,它会替换系统的默认映射,让Unity读取到PS4手柄的真实名称。不过这种方法是系统级调整,需注意工具的版本兼容性。
3. 更新Unity Input System包
确保你使用的是最新版本的Unity Input System包,旧版本可能存在设备识别逻辑不完善的问题,更新后可能直接正确显示PS4手柄的displayName。
内容的提问来源于stack exchange,提问作者Okashi
相关产品推荐
相关产品推荐

