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

Unity同时启用鼠标与控制器输入时,物体未按预期仅在左键按下时跟随鼠标旋转的问题

Unity同时启用鼠标与控制器输入时,物体未按预期仅在左键按下时跟随鼠标旋转的问题

嘿,我看你遇到了一个挺常见的输入冲突问题,咱们来一步步解决它~

首先先明确你的核心需求:

  • 鼠标旋转:只有按住左键时,物体才跟着鼠标移动旋转
  • 控制器旋转:右摇杆移动时,物体正常旋转
  • 但现在的问题是,当同时启用两种输入方式时,即使没按左键,物体也会跟着鼠标转

问题根源分析

看了你贴的代码,我发现关键问题在于你混用了Unity的新旧两套输入系统:

  • 检测鼠标左键用的是旧Input系统的Input.GetMouseButton(0)
  • 读取鼠标移动增量用的是新Input System的Mouse.current.delta.ReadValue()

这两套系统是完全独立的,它们的输入状态不会同步。当有控制器连接时,旧系统的按键检测可能出现异常,导致Input.GetMouseButton(0)在你没按左键时也返回true,进而触发了鼠标旋转的逻辑。

修复方案:统一使用一套输入系统

解决这个问题的核心就是把输入逻辑统一到同一套系统下,下面给你两种可行的方案:

方案一:全用新Input System(推荐)

既然你已经在使用新系统的控制器输入,那直接把鼠标按键检测也换成新系统的API就行:

private void Update()
{
    if (!isInspecting || objectInspect == null) return;

    RotateWithController();
    RotateObject();
}

private void RotateObject()
{
    // 用新Input System检测左键按下状态
    if (Mouse.current.leftButton.isPressed)
    {
        Vector2 mouseDelta = Mouse.current.delta.ReadValue();
        if (mouseDelta != Vector2.zero)
        {
            objectInspect.transform.Rotate(new Vector3(-mouseDelta.y, mouseDelta.x, 0) * Time.deltaTime * rotationSpeed, Space.World);
        }
    }
}

private void RotateWithController()
{
    Vector2 rotationInput = rotateItem.ReadValue<Vector2>();

    if (rotationInput != Vector2.zero)
    {
        objectInspect.transform.Rotate(new Vector3(-rotationInput.y, rotationInput.x, 0) * Time.deltaTime * rotationSpeed * 8f, Space.World);
    }
}

方案二:全用旧Input Manager

如果你更习惯旧系统的用法,也可以把鼠标增量读取换成旧API:

private void Update()
{
    if (!isInspecting || objectInspect == null) return;

    RotateWithController();
    RotateObject();
}

private void RotateObject()
{
    if (Input.GetMouseButton(0))
    {
        // 用旧系统读取鼠标移动增量
        float mouseX = Input.GetAxis("Mouse X");
        float mouseY = Input.GetAxis("Mouse Y");
        Vector2 mouseDelta = new Vector2(mouseX, mouseY);
        
        if (mouseDelta != Vector2.zero)
        {
            objectInspect.transform.Rotate(new Vector3(-mouseY, mouseX, 0) * Time.deltaTime * rotationSpeed, Space.World);
        }
    }
}

private void RotateWithController()
{
    // 如果控制器输入也用旧系统的话,改成对应的轴输入
    // 比如:Vector2 rotationInput = new Vector2(Input.GetAxis("Right Stick X"), Input.GetAxis("Right Stick Y"));
    Vector2 rotationInput = rotateItem.ReadValue<Vector2>();

    if (rotationInput != Vector2.zero)
    {
        objectInspect.transform.Rotate(new Vector3(-rotationInput.y, rotationInput.x, 0) * Time.deltaTime * rotationSpeed * 8f, Space.World);
    }
}

额外建议

如果想进一步优化体验,还可以添加一个输入互斥逻辑:比如当控制器的右摇杆有输入时,暂时忽略鼠标旋转的触发,避免两种输入同时生效导致的混乱,不过这取决于你的具体需求。

备注:内容来源于stack exchange,提问作者Kaio Barbosa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:24:34