Unity中无法将玩家移动到触摸点问题求助
问题分析与修复方案
原代码的核心问题有三个:
- 距离停止条件逻辑完全搞反,导致玩家刚触发移动就被立刻停止
- 仅在触摸开始时设置一次移动方向,未处理手指拖动过程中的目标位置更新
- 距离变量的更新顺序错误,导致判断逻辑失效
修复后的代码
void TouchMovement() { if (Input.touchCount > 0) { touch = Input.GetTouch(0); switch(touch.phase) { case TouchPhase.Began: // 触摸开始时初始化目标位置和移动状态 isMoving = true; _touchPosition = Camera.main.ScreenToWorldPoint(touch.position); _touchPosition.z = 0; break; case TouchPhase.Moved: // 手指拖动时实时更新目标位置 _touchPosition = Camera.main.ScreenToWorldPoint(touch.position); _touchPosition.z = 0; break; case TouchPhase.Ended: case TouchPhase.Canceled: // 触摸结束时停止移动 isMoving = false; _rb.velocity = Vector2.zero; break; } if (isMoving) { // 计算当前到目标的距离 float distanceToTarget = (_touchPosition - transform.position).magnitude; // 设置移动阈值,当距离小于这个值时停止,避免抖动 float stopThreshold = 0.1f; if (distanceToTarget < stopThreshold) { isMoving = false; _rb.velocity = Vector2.zero; transform.position = _touchPosition; // 直接对齐目标位置 } else { // 计算移动方向并设置速度 Vector2 whereToMove = (_touchPosition - transform.position).normalized; _rb.velocity = whereToMove * _speed; } } } else { // 无触摸时确保停止移动 isMoving = false; _rb.velocity = Vector2.zero; } }
关键改动说明
- 重构触摸阶段处理:用
switch分别处理Began(初始化)、Moved(实时更新目标)、Ended/Canceled(停止移动),覆盖完整触摸生命周期 - 修正停止逻辑:当玩家距离触摸点小于阈值时才停止,避免刚启动就被中断,同时直接对齐目标位置防止抖动
- 实时更新移动方向:每次循环都重新计算方向和速度,确保玩家始终朝向当前触摸点移动
- 增加无触摸状态处理:避免触摸结束后玩家继续移动
内容的提问来源于stack exchange,提问作者Ashok
相关产品推荐
相关产品推荐

