Unity技术问题:手指跟随移动仅单方向生效,寻求解决方案
修复Unity单指触摸仅单方向移动的问题
嘿,我瞅了你的代码,很快发现几个会导致只有单个方向生效的问题,咱们一步步来搞定它:
问题分析
- 轴对应错误:你把触摸转换后的
pos.y和刚体的rb.position.z做比较,这大概率是搞混了坐标系!如果是2D游戏,刚体的垂直方向应该是rb.position.y;如果是3D俯视角游戏,那你得确认触摸转换后的坐标是否应该对应Z轴,但这里的转换代码用了ScreenToWorldPoint并传了Z=0,可能转换后的Y值并不是你要的世界空间Z值,这会导致垂直方向的判断完全失效。 - 代码不完整:你写的
movevertical =...后面没写完,这会导致垂直方向的变量根本没被正确赋值,自然不会有效果。 - 缺少"无移动"的判断:当触摸位置和物体位置几乎重合时,没有把
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
相关产品推荐
相关产品推荐

