Unity中使用MoveTowards实现双GameObject触摸分向移动失败问题排查
排查Unity中
MoveTowards触摸移动失效的问题 嘿,我来帮你捋一捋这个问题!Vector3.MoveTowards本身是Unity内置的静态方法,不需要额外引入特殊类或插件,没生效大概率是用法细节没处理对,下面是几个常见的排查方向:
必须在帧更新函数里调用
MoveTowards是计算单帧内的位置增量,要是只调用一次(比如在Start里),物体只会瞬间跳一下或者完全没反应。一定要把移动逻辑放在Update或FixedUpdate里,保证每一帧都更新位置。触摸坐标要转成世界空间坐标
触摸输入的position是屏幕像素坐标,直接用的话和物体的世界坐标不在一个空间里。必须用Camera.ScreenToWorldPoint()转换,还要注意Z轴的设置:- 2D场景:把目标位置的Z值设成和物体当前的Z值一致,避免物体被相机拉远/拉近
- 3D场景:Z值要设置成相机到物体所在平面的距离
速度要乘以
Time.deltaTime
要是直接写固定数值当移动步长,不同帧率下移动速度会不一致,而且数值太小的话看起来就像没动。记得用moveSpeed * Time.deltaTime来保证帧率无关的平滑移动。检查两个物体的逻辑是否独立
别把两个物体的目标位置搞混了,比如不小心让两个物体都追同一个触摸点;还要确认脚本有没有正确挂载,或者物体有没有被设置成静态(静态物体无法移动)。
给你一个可用的示例代码(2D场景)
using UnityEngine; public class DualTouchMovement : MonoBehaviour { // 在Inspector里拖入两个需要移动的物体 public GameObject objectA; public GameObject objectB; // 移动速度,可在Inspector调整 public float movementSpeed = 6f; void Update() { // 检测是否有至少两个触摸点 if (Input.touchCount >= 2) { // 第一个触摸点控制objectA Touch touchA = Input.GetTouch(0); Vector3 targetPosA = Camera.main.ScreenToWorldPoint(touchA.position); // 保持Z轴和物体一致,避免偏移 targetPosA.z = objectA.transform.position.z; objectA.transform.position = Vector3.MoveTowards( objectA.transform.position, targetPosA, movementSpeed * Time.deltaTime ); // 第二个触摸点控制objectB Touch touchB = Input.GetTouch(1); Vector3 targetPosB = Camera.main.ScreenToWorldPoint(touchB.position); targetPosB.z = objectB.transform.position.z; objectB.transform.position = Vector3.MoveTowards( objectB.transform.position, targetPosB, movementSpeed * Time.deltaTime ); } } }
额外注意点
如果你的物体带有Rigidbody(2D或3D),建议用Rigidbody.MovePosition()代替直接修改transform.position,这样能和物理系统兼容,避免穿模或抖动的问题。
内容的提问来源于stack exchange,提问作者narayana
相关产品推荐
相关产品推荐

