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

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标签页:

    1. 选中KeyboardAndMouse方案,在Devices区域添加Keyboard和Mouse设备,将匹配规则设为Any(只要存在其中一个设备就匹配该方案)。
    2. 选中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:05:23