Android设备UI点击检测:Unity可滚动面板误收起问题排查
问题解决方法
你的核心问题是没有区分「点击滚动面板UI」和「点击其他区域」,现有代码的UI检测逻辑仅判断是否在UI上就直接返回,但滚动面板本身属于UI,当你在面板内操作时本应跳过收起逻辑,却因触摸场景下的检测漏洞触发了误收起。
关键修正点
- 统一处理鼠标和触摸输入,避免仅针对触摸的检测逻辑导致鼠标操作出错;
- 增加滚动面板区域判断:点击面板内部时直接跳过收起逻辑;
- 优化射线检测触发条件,确保仅在非面板区域点击时才执行展开/收起判断。
修正后的代码
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
相关产品推荐
相关产品推荐

