Unity触摸检测:如何实现长按满0.5秒立即触发而非松手后触发
触摸长按即时触发实现方案
实现思路
原有逻辑仅在触摸结束时判断触发事件,要实现按住满0.5秒立即触发长按,需新增状态标记位记录长按是否已触发,同时在触摸保持阶段实时检测按压时长,达到阈值后立即执行长按逻辑,避免后续误触单击事件。
完整修改后代码
private float TouchTime = 0; // 标记长按是否已经触发,避免重复执行和误触单击 private bool isLongTapTriggered = false; // 长按阈值常量,方便后续调整 private const float LONG_TAP_THRESHOLD = 0.5f; void Update () { // 先判断是否存在触摸,避免数组越界报错 if (Input.touchCount <= 0) return; Touch touch = Input.touches[0]; if (touch.phase == TouchPhase.Began) { TouchTime = Time.time; // 每次新触摸按下时重置长按触发标记 isLongTapTriggered = false; } // 触摸保持/移动阶段检测长按触发 if (touch.phase == TouchPhase.Stationary || touch.phase == TouchPhase.Moved) { // 未触发过长按且按压时长达到阈值 if (!isLongTapTriggered && Time.time - TouchTime >= LONG_TAP_THRESHOLD) { isLongTapTriggered = true; // 此处替换为你的长按执行逻辑 } } if (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled) { // 仅当长按未触发时才判断单击逻辑 if (!isLongTapTriggered && Time.time - TouchTime <= LONG_TAP_THRESHOLD) { // 此处替换为你的单点轻触执行逻辑 } } }
配置说明
- 如果不需要支持按住移动时触发长按,只需要把长按检测条件里的
touch.phase == TouchPhase.Moved删掉即可 - 新增的标记位
isLongTapTriggered可以保证一次触摸流程中长按仅触发一次,同时避免长按后松手误触发单击事件 - 提前判断
Input.touchCount可以避免无触摸时访问Input.touches[0]导致的数组越界报错
内容的提问来源于stack exchange,提问作者Altresi
相关产品推荐
相关产品推荐

