Unity中transform.Translate移动对象未停止问题求助
解决Unity对象到达指定位置后无法停止移动的问题
你的问题出在两个核心点上:
- 浮点数精度误差:
transform.position和stopPos都是浮点型三维向量,受Time.deltaTime影响,每次移动的步长是浮点值,几乎不可能让位置完全等于目标点,导致transform.position != stopPos永远为真,对象会持续移动。 - 移动方向逻辑错误:直接用
Vector3.left固定方向移动,若stopPos不在对象左侧,对象根本不会朝着目标点移动,自然触发不了停止条件。
给你两个实用的解决方案:
方案一:基于距离阈值的判断(适配误差)
// 自定义允许的误差范围,根据场景调整,比如0.01f float positionThreshold = 0.01f; if (Vector3.Distance(transform.position, stopPos) > positionThreshold) { // 计算朝向目标点的单位方向向量 Vector3 moveDirection = (stopPos - transform.position).normalized; // 朝着目标点移动,速度可自行调整 transform.Translate(moveDirection * Time.deltaTime * 2f); }
通过判断当前位置与目标点的距离是否大于阈值来决定是否移动,规避了浮点数精度导致的判断失效,同时确保移动方向始终朝向目标点。
方案二:使用Vector3.MoveTowards(精准到位)
// 设置移动速度 float moveSpeed = 2f; // MoveTowards自动处理移动逻辑,到达目标点后停止 transform.position = Vector3.MoveTowards(transform.position, stopPos, moveSpeed * Time.deltaTime);
Unity内置的Vector3.MoveTowards方法会自动计算每次移动的最大步长,保证不会超过目标点,到达后位置不再变化,无需额外条件判断,代码更简洁可靠。
额外注意
- 确保
stopPos的坐标系和transform.position一致(默认都是世界坐标,若用局部坐标需改为transform.localPosition)。 - 调整
moveSpeed参数适配场景的移动速度需求。
内容的提问来源于stack exchange,提问作者Nikita Nikiforov
相关产品推荐
相关产品推荐

