Unity3D安卓游戏滑动方向识别异常:触摸均触发跳跃求修复
修复Unity安卓端触摸滑动方向检测问题
原代码的核心问题
- 滑动状态残留:
swipeDirection变量没有在合适时机重置,一次滑动后的值会保留到下一次触摸,导致误触发。 - 触发时机错误:跳跃/滑行判断时只要触摸存在就检查
swipeDirection,但该变量只有在触摸结束时才更新,触摸过程中会使用旧值;而触摸结束后Input.touchCount会变为0,又无法检测到新的swipeDirection。 - 无防误触阈值:轻微的手指偏移会被判定为有效滑动,导致误操作。
修复方案
步骤1:调整变量定义
添加滑动阈值和一次性触发标记,替代原有的swipeDirection:
private Vector2 touchStartPosition; // 滑动阈值,可根据屏幕尺寸调整,过滤轻微抖动 private float swipeThreshold = 50f; // 一次性触发标记,和GetKeyDown行为对齐 private bool jumpTriggered; private bool slideTriggered;
步骤2:重写触摸检测逻辑
每帧重置触发标记,仅在触摸结束时判断滑动方向并标记触发:
void Update() { // 每帧重置触发标记,确保单次滑动只触发一次 jumpTriggered = false; slideTriggered = false; // 触摸滑动检测 if (Input.touchCount > 0) { Touch theTouch = Input.GetTouch(0); switch (theTouch.phase) { case TouchPhase.Began: // 记录触摸起始位置 touchStartPosition = theTouch.position; break; case TouchPhase.Ended: Vector2 touchEndPosition = theTouch.position; float swipeDeltaY = touchEndPosition.y - touchStartPosition.y; // 判断滑动距离是否达到阈值 if (Mathf.Abs(swipeDeltaY) > swipeThreshold) { if (swipeDeltaY > 0) { // 向上滑动,标记跳跃触发 jumpTriggered = true; } else { // 向下滑动,标记滑行触发 slideTriggered = true; } } break; case TouchPhase.Canceled: // 触摸被中断时重置起始位置,避免错误判断 touchStartPosition = Vector2.zero; break; } } // 跳跃逻辑 if ((Input.GetKeyDown(KeyCode.UpArrow) || jumpTriggered) && isOnGround) { // 你的跳跃代码 } // 滑行逻辑 if ((Input.GetKeyDown(KeyCode.DownArrow) || slideTriggered) && isOnGround) { // 你的滑行代码 } }
关键优化点
- 一次性触发:用
jumpTriggered和slideTriggered替代持续的方向值,和键盘GetKeyDown的触发逻辑完全对齐,避免重复触发。 - 防误触阈值:只有滑动距离超过设定阈值时才判定为有效滑动,过滤手指抖动。
- 触摸中断处理:添加
TouchPhase.Canceled的处理,避免触摸被意外中断时留下错误的起始位置。
内容的提问来源于stack exchange,提问作者TecBrat
相关产品推荐
相关产品推荐

