You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 02:50:33