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

Unity中屏幕按钮激活时鼠标/触摸点击场景物体无响应问题求助

Unity中屏幕按钮激活时鼠标/触摸点击场景物体无响应问题求助

看起来你遇到的是Unity UI系统和Input Actions输入事件的优先级冲突问题——当你启用了带On-Screen Button组件的UI按钮后,Unity的EventSystem会优先捕获所有鼠标/触摸输入,哪怕你点击的是场景空白区域而非按钮,它也可能把输入标记为“已处理”,导致你的Input Action回调OnMouseClickPerformed完全没机会触发。

我来给你几个针对性的解决思路,按从易到难排序:

1. 让Input Actions忽略UI输入拦截

这是最简单的解决方案:

  • 打开你的Input Actions Asset文件,找到你绑定的Left Mouse Click和Press [TouchScreen]动作;
  • 选中对应的输入绑定(比如Mouse -> Left Button,或者Touchscreen -> Primary Touch -> Tap);
  • 在Inspector面板的Binding Properties里,找到UI Interaction选项,把它改成Ignore;
  • 保存设置后再测试,此时Input Actions会无视EventSystem的UI输入拦截,不管有没有UI按钮,你的点击回调都会正常触发。

2. 检查并调整Player Input的事件触发设置

如果上面的方法没起效,可以检查你的Player Input组件:

  • 确保Player Input的Behavior设置为Invoke Unity Events或者Send Messages,且你已经正确把OnMouseClickPerformed函数绑定到了对应的输入事件上;
  • 另外,在Player Input的Settings里,确认Run In Background是勾选状态(避免窗口焦点问题),Input Actions是你当前使用的Asset。

3. 代码层面补充UI点击判断(可选)

即使解决了触发问题,你可能还需要避免点击到UI时误触发场景物体的交互。可以在你的OnMouseClickPerformed函数开头加入UI判断:

public void OnMouseClickPerformed(InputAction.CallbackContext context)
{
    if (!context.started) return;

    // 新增:判断是否点击到UI元素
    if (EventSystem.current.IsPointerOverGameObject())
    {
        Debug.Log("点击到UI,跳过场景交互");
        return;
    }

    Vector3 mousePos;
    if (TouchSimulation.instance.isActiveAndEnabled)
        mousePos = Touchscreen.current.position.ReadValue();
    else
        mousePos = Mouse.current.position.ReadValue();
    
    Debug.Log($"Click Pos: {mousePos}");
    
    int gameplayLayerMask = LayerMask.GetMask("Default");
    RaycastHit2D hit = Physics2D.GetRayIntersection(mainCamera.ScreenPointToRay(mousePos), Mathf.Infinity, gameplayLayerMask);
    
    if (hit.collider != null)
    {
        Debug.Log($"{hit.collider.gameObject.name}");
        HandleInteractableObject(hit.collider.gameObject);
    }
}

这样就算Input Actions捕获了所有点击,也会自动跳过UI区域的点击。

4. 替代方案:分离UI和场景的输入处理

如果上面的方法都不符合你的需求,还可以把UI按钮的逻辑从Input Actions里剥离:

  • 给左右移动的UI按钮直接添加OnClick事件,调用你的移动脚本对应的函数(比如MoveLeft()和MoveRight());
  • 场景物体的点击依然用Input Actions处理。
    这种方式彻底分开了UI和场景的输入,从根源上避免了冲突。

你可以先试试第一种方法,这是最直接解决问题的手段,应该能快速让你的点击回调重新触发。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 12:38:07