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

Android设备UI点击检测:Unity可滚动面板误收起问题排查

问题解决方法

你的核心问题是没有区分「点击滚动面板UI」和「点击其他区域」,现有代码的UI检测逻辑仅判断是否在UI上就直接返回,但滚动面板本身属于UI,当你在面板内操作时本应跳过收起逻辑,却因触摸场景下的检测漏洞触发了误收起。

关键修正点

  1. 统一处理鼠标和触摸输入,避免仅针对触摸的检测逻辑导致鼠标操作出错;
  2. 增加滚动面板区域判断:点击面板内部时直接跳过收起逻辑;
  3. 优化射线检测触发条件,确保仅在非面板区域点击时才执行展开/收起判断。

修正后的代码

void Update()
{
    // 同时响应鼠标按下和触摸开始事件
    bool isInputTriggered = Input.GetMouseButtonDown(0) || 
                            (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began);

    if (!isInputTriggered) return;

    Vector2 inputPosition = Input.touchCount > 0 ? Input.GetTouch(0).position : Input.mousePosition;
    bool isPointerOverUI = false;

    // 正确检测当前输入是否落在UI元素上
    if (Input.touchCount > 0)
    {
        isPointerOverUI = EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId);
    }
    else
    {
        isPointerOverUI = EventSystem.current.IsPointerOverGameObject();
    }

    // 引用你的滚动面板RectTransform(若脚本未挂载在面板上,需手动赋值)
    RectTransform panelRect = GetComponent<RectTransform>();
    // 检查输入是否落在滚动面板范围内(Canvas为Overlay模式时,第三个参数传null)
    bool isPointerOverPanel = RectTransformUtility.RectangleContainsScreenPoint(panelRect, inputPosition, Camera.main);

    // 若点击的是滚动面板,直接返回,不执行收起逻辑
    if (isPointerOverUI && isPointerOverPanel)
    {
        return;
    }

    // 非面板区域,执行射线检测判断
    Ray ray = Camera.main.ScreenPointToRay(inputPosition);
    if (Physics.Raycast(ray, out RaycastHit hit))
    {
        if (hit.transform.gameObject.layer == LayerMask.NameToLayer("Boutiques"))
        {
            GetComponent<Animator>().Play("AnimUP");
        }
        else
        {
            // 点击其他3D物体,收起面板
            GetComponent<Animator>().Play("AnimDOWN");
        }
    }
    else
    {
        // 点击空白区域,收起面板
        GetComponent<Animator>().Play("AnimDOWN");
    }
}

额外注意事项

  • 若Canvas为Overlay渲染模式,RectTransformUtility.RectangleContainsScreenPoint的第三个参数需传null,无需指定相机;
  • 确保滚动面板的RectTransform边界设置准确,该判断依赖面板的矩形边界;
  • 滚动面板的子UI元素(如滚动条、文本)无需额外处理,只要点击位置在面板Rect范围内就会被判定为面板区域。

内容的提问来源于stack exchange,提问作者Angelina Pyankova

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:50:31