Unity.Netcode结合Starter Asset Controller时客户端输入设备异常
解决Unity客户端默认优先Xbox控制器而非键鼠的问题(非硬编码切换方案)
问题背景
服务器端可正常使用键盘鼠标,但客户端始终默认优先使用Xbox控制器;已尝试销毁非Owner的PlayerInput组件无效,需避开硬编码map.SwitchCurrentControlScheme("KeyboardAndMouse");的解决办法。
可行解决方案
调整PlayerInput控制方案优先级
在客户端PlayerInput的Inspector面板中,找到Control Schemes列表,将KeyboardAndMouse拖动到XboxController的上方。Unity输入系统会按列表顺序匹配第一个可用的控制方案,只要键鼠设备存在,就会优先选中它。注意要在Player预制体中提前设置好这个顺序,避免动态生成对象时配置重置。配置输入动作的设备匹配规则
打开Starter Asset的.inputactions配置文件,进入Control Schemes标签页:- 选中
KeyboardAndMouse方案,在Devices区域添加Keyboard和Mouse设备,将匹配规则设为Any(只要存在其中一个设备就匹配该方案)。 - 选中
XboxController方案,将匹配规则设为Only if no other schemes match,这样只有当键鼠设备都未检测到时,才会自动切换到控制器方案。
- 选中
优化PlayerInput组件的启用逻辑
之前销毁非Owner的PlayerInput无效,大概率是执行时机问题,改成禁用而非销毁,并调整执行时机:private void OnEnable() { if (!IsOwner) { GetComponent<PlayerInput>().enabled = false; } else { // 确保客户端Owner的输入组件只监听本地设备 GetComponent<PlayerInput>().camera = Camera.main; GetComponent<PlayerInput>().notificationBehavior = PlayerNotificationBehavior.SendMessages; } }禁用非Owner的输入组件,既能避免非控制端响应输入,也不会破坏网络同步时的组件结构。
全局调整输入设备优先级
通过输入系统的全局设置,提高键鼠设备的优先级,无需指定控制方案名称:private void Start() { if (IsOwner) { // 给键鼠设置更高优先级,控制器优先级调低 InputSystem.settings.SetDevicePriority(typeof(Keyboard), 100); InputSystem.settings.SetDevicePriority(typeof(Mouse), 100); InputSystem.settings.SetDevicePriority(typeof(Gamepad), 50); } }该配置全局生效,适合所有需要优先使用键鼠的场景。
内容的提问来源于stack exchange,提问作者HardcoreGamer
相关产品推荐
相关产品推荐

