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

Unity3D安卓游戏滑动方向识别异常:触摸均触发跳跃求修复

修复Unity安卓端触摸滑动方向检测问题

原代码的核心问题

  1. 滑动状态残留:swipeDirection变量没有在合适时机重置,一次滑动后的值会保留到下一次触摸,导致误触发。
  2. 触发时机错误:跳跃/滑行判断时只要触摸存在就检查swipeDirection,但该变量只有在触摸结束时才更新,触摸过程中会使用旧值;而触摸结束后Input.touchCount会变为0,又无法检测到新的swipeDirection。
  3. 无防误触阈值:轻微的手指偏移会被判定为有效滑动,导致误操作。

修复方案

步骤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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:25:17