Godot引擎中Xbox Series X手柄被识别为2个控制器的问题求助
问题根源
该现象由Godot引擎Windows平台默认同时启用XInput、RawInput双输入后端导致:Xbox Series手柄会被两个后端同时识别,因此单个物理手柄对应两个逻辑设备ID;老款Xbox One手柄仅被XInput后端识别,因此无重复问题。
解决方案
- 方案1:禁用RawInput后端
无需修改现有业务逻辑,在项目全局初始化阶段关闭RawInput即可,仅保留兼容性更好的XInput后端处理手柄输入,完全覆盖普通Xbox手柄的功能需求。
在自动加载的全局脚本的_ready方法中添加以下代码:
func _ready(): Input.set_use_raw_input(false)
修改后重新运行项目,手柄枚举就会恢复正常,单个Xbox Series手柄仅会显示一条设备记录。
- 方案2:手动过滤重复设备
如果需要保留RawInput对其他非常规手柄的支持,可以通过GUID对枚举到的手柄做去重处理,优先保留XInput对应的设备条目,避免重复。
自定义去重获取手柄列表的方法示例:
func get_unique_connected_joypads() -> Array: var used_guids = [] var unique_devices = [] for device_id in Input.get_connected_joypads(): var current_guid = Input.get_joy_guid(device_id) # XInput设备优先级更高,避免同个手柄的RawInput条目覆盖XInput条目 if current_guid == "__XINPUT_DEVICE__": unique_devices.append(device_id) used_guids.append(current_guid) elif current_guid not in used_guids: unique_devices.append(device_id) used_guids.append(current_guid) return unique_devices
后续所有获取已连接手柄列表的逻辑,都调用该自定义方法代替原生的Input.get_connected_joypads()即可。
- 方案3:加入逻辑层防重
如果不想修改手柄枚举逻辑,可以在玩家按手柄按键加入游戏的环节做校验:记录所有已加入玩家对应的手柄GUID,同一个GUID仅允许生成一个玩家,避免重复设备触发多次加入逻辑。
内容的提问来源于stack exchange,提问作者rustybulb
相关产品推荐
相关产品推荐

