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

Unity技术问题:手指跟随移动仅单方向生效,寻求解决方案

修复Unity单指触摸仅单方向移动的问题

嘿,我瞅了你的代码,很快发现几个会导致只有单个方向生效的问题,咱们一步步来搞定它:

问题分析

  1. 轴对应错误:你把触摸转换后的pos.y和刚体的rb.position.z做比较,这大概率是搞混了坐标系!如果是2D游戏,刚体的垂直方向应该是rb.position.y;如果是3D俯视角游戏,那你得确认触摸转换后的坐标是否应该对应Z轴,但这里的转换代码用了ScreenToWorldPoint并传了Z=0,可能转换后的Y值并不是你要的世界空间Z值,这会导致垂直方向的判断完全失效。
  2. 代码不完整:你写的movevertical =...后面没写完,这会导致垂直方向的变量根本没被正确赋值,自然不会有效果。
  3. 缺少"无移动"的判断:当触摸位置和物体位置几乎重合时,没有把movehorizontal或movevertical设为0,可能会导致物体一直保持之前的方向移动。

修复后的完整代码

if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved) 
{ 
    // 转换触摸坐标到世界空间,注意这里的Z值要和你的物体在相机前的深度匹配
    // 如果是2D游戏,通常相机的正交模式下,Z可以设为Camera.main.nearClipPlane或者物体的Z值
    Vector3 touchWorldPos = Camera.main.ScreenToWorldPoint(
        new Vector3(Input.GetTouch(0).position.x, Input.GetTouch(0).position.y, Camera.main.nearClipPlane)
    ); 

    // 水平方向判断
    if (touchWorldPos.x < rb.position.x - 0.1f) // 加个小阈值避免抖动
    { 
        movehorizontal = -1; 
    } 
    else if(touchWorldPos.x > rb.position.x + 0.1f) 
    { 
        movehorizontal = 1; 
    }
    else
    {
        movehorizontal = 0; // 触摸在物体附近,停止水平移动
    }

    // 垂直方向判断(这里修正为和rb的Y轴比较,如果你是3D俯视角,改成rb.position.z即可)
    if (touchWorldPos.y < rb.position.y - 0.1f) 
    { 
        movevertical = -1; 
    } 
    else if(touchWorldPos.y > rb.position.y + 0.1f) 
    { 
        movevertical = 1; 
    }
    else
    {
        movevertical = 0; // 触摸在物体附近,停止垂直移动
    }
}

关键修复点说明

  • 修正坐标系对应:把触摸转换后的坐标和刚体正确的轴做比较,2D游戏用rb.position.y,3D俯视角游戏调整为rb.position.z,同时注意ScreenToWorldPoint的Z参数要正确,确保转换后的坐标是物体所在的平面位置。
  • 补全赋值语句:把之前没写完的movevertical赋值补全,并且用else if和else覆盖所有情况,避免变量保留旧值。
  • 添加抖动阈值:加了±0.1的小阈值,避免触摸位置和物体位置几乎重合时,物体出现来回抖动的情况。

如果你是3D游戏,只需要把垂直方向的rb.position.y改成rb.position.z,同时调整ScreenToWorldPoint的Z参数为物体所在的Z深度就行啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:23:01