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

安卓触摸控件X轴位置识别异常,Unity游戏触摸移动问题求助

解决Unity安卓游戏单指触摸跟随X轴移动的平滑控制问题

看起来你在Unity安卓游戏的触摸控制上卡壳了,我来帮你梳理下当前代码的问题,并给出符合你需求的解决方案。

当前代码的核心问题

你现在的代码是直接给transform.position加/减固定值,这种方式有两个明显的问题:

  • 移动生硬不平滑:每一帧直接跳固定距离,不是真正的"跟随",更像是瞬移
  • 帧率依赖:如果设备帧率波动,移动速度会忽快忽慢,用户体验很差
  • 另外你提到的松开手指后滑动的问题,之前用AddForce是因为刚体保留了速度,而如果没处理触摸抬起的逻辑,也可能导致异常移动

解决方案:平滑跟随实现

我给你两种常见的实现方式,你可以根据自己的游戏是否使用刚体来选择:

方式1:无刚体(直接控制Transform)

这种方式适合不需要物理碰撞的场景,实现简单且平滑:

public float moveSpeed = 6f; // 调整这个值控制移动快慢,建议从5-10开始试
private Vector3 targetPosition;

void Update()
{
    // 默认目标位置为当前位置,确保手指抬起后球立刻停止
    targetPosition = transform.position;

    foreach (Touch touch in Input.touches)
    {
        if (touch.fingerId == 0)
        {
            // 将屏幕触摸坐标转换为世界坐标,固定Z轴避免偏移
            Vector3 touchWorldPos = Camera.main.ScreenToWorldPoint(touch.position);
            touchWorldPos.z = transform.position.z;
            
            // 只更新X轴的目标位置
            targetPosition.x = touchWorldPos.x;

            // 可选:限制球的移动范围,防止移出屏幕
            // targetPosition.x = Mathf.Clamp(touchWorldPos.x, -8f, 8f); // 替换成你的左右边界值
        }
        else if (touch.fingerId == 1)
        {
            // 仅在第二根手指刚按下时触发加速,避免重复触发
            if (touch.phase == TouchPhase.Began)
            {
                Accelerate();
            }
        }
    }

    // 使用Lerp实现平滑插值移动,乘以Time.deltaTime保证帧率无关
    transform.position = Vector3.Lerp(transform.position, targetPosition, moveSpeed * Time.deltaTime);
}

方式2:有刚体(物理控制)

如果你的球需要和场景中的物体发生物理碰撞,用刚体控制更合适,同时能彻底解决松开手指后滑动的问题:

public Rigidbody2D rb; // 在Inspector面板拖拽你的球的刚体组件到这里
public float moveSpeed = 5f;
public float accelerationImpulse = 12f;

void Update()
{
    bool hasSingleFinger = false;

    foreach (Touch touch in Input.touches)
    {
        if (touch.fingerId == 0)
        {
            hasSingleFinger = true;
            Vector3 touchWorldPos = Camera.main.ScreenToWorldPoint(touch.position);
            touchWorldPos.z = transform.position.z;
            
            // 计算手指与球的X轴差值,转换成目标速度
            float xVelocity = Mathf.Clamp((touchWorldPos.x - transform.position.x) * moveSpeed, -moveSpeed, moveSpeed);
            // 保持Y轴速度不变,只更新X轴速度
            rb.velocity = new Vector2(xVelocity, rb.velocity.y);
        }
        else if (touch.fingerId == 1 && touch.phase == TouchPhase.Began)
        {
            // 给刚体添加瞬间加速的冲量(假设Y轴是前进方向,可根据你的游戏调整)
            rb.AddForce(Vector2.up * accelerationImpulse, ForceMode2D.Impulse);
        }
    }

    // 当没有单指触摸时,直接将X轴速度设为0,彻底停止滑动
    if (!hasSingleFinger)
    {
        rb.velocity = new Vector2(0, rb.velocity.y);
    }
}

额外优化建议

  • 移动范围限制:建议用Mathf.Clamp限制球的X轴位置,防止球移出可视区域
  • 灵敏度调整:如果觉得跟随太灵敏或太迟钝,调整moveSpeed的值即可
  • 双指逻辑优化:如果你的Accelerate()是持续加速,建议在TouchPhase.Stationary时触发,而不是每一帧,避免过度加速

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:04:36