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
相关产品推荐
相关产品推荐

