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

Unity中移除Button的touchCount统计但保留其点击功能的方法

解决Unity中按钮触摸干扰最后触摸位置记录的问题

核心思路

通过判断触摸是否命中UI元素,过滤掉按钮等UI交互产生的触摸输入,只记录非UI区域的触摸位置,同时保留按钮的原生点击功能。

具体实现方法

方法1:在记录触摸位置时过滤UI触摸

在Update方法中获取触摸输入时,通过EventSystem判断当前触摸是否落在UI上,仅更新非UI触摸的位置:

private Vector2 lastValidTouchPosition;

void Update()
{
    if (Input.touchCount > 0)
    {
        Touch currentTouch = Input.GetTouch(0);
        // 关键判断:排除命中UI的触摸(移动端必须传入fingerId)
        bool isTouchOverUI = EventSystem.current.IsPointerOverGameObject(currentTouch.fingerId);
        
        if (!isTouchOverUI)
        {
            // 记录触摸开始或移动时的位置
            if (currentTouch.phase == TouchPhase.Began || currentTouch.phase == TouchPhase.Moved)
            {
                lastValidTouchPosition = currentTouch.position;
            }
        }
    }
}

按钮的点击功能无需修改,Unity的UI事件系统会正常响应按钮点击,且这些触摸不会被记录到lastValidTouchPosition中。

方法2:用UI事件接口单独处理按钮逻辑

给生成二维码的按钮绑定自定义脚本,通过IPointerClickHandler接口处理点击,确保按钮逻辑与触摸位置记录完全分离:

using UnityEngine;
using UnityEngine.EventSystems;

public class QRGenerateButton : MonoBehaviour, IPointerClickHandler
{
    // 引用记录触摸位置的脚本
    public TouchPositionRecorder positionRecorder;

    public void OnPointerClick(PointerEventData eventData)
    {
        // 使用之前记录的有效触摸位置生成二维码
        GenerateQRCode(positionRecorder.lastValidTouchPosition);
    }

    private void GenerateQRCode(Vector2 spawnPosition)
    {
        // 你的二维码生成与实例化逻辑
        Debug.Log($"在位置{spawnPosition}生成二维码");
    }
}

对应的触摸位置记录脚本(即方法1中的代码)保持不变,这样按钮点击通过UI事件系统触发,不会干扰触摸位置的统计。

注意事项

  • 移动端必须在IsPointerOverGameObject中传入触摸的fingerId,否则UI判断会失效;PC端测试时可省略参数或传入-1。
  • 确保场景中存在EventSystem对象(默认创建UI时会自动生成),否则UI交互和触摸判断都会失效。

内容的提问来源于stack exchange,提问作者P D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:15:41