Unity中游戏对象在两位置间无限往复移动的问题求助
问题分析与修复方案
核心问题
- 代码第一行每帧都会强制执行向
distanciaMinima的移动:即便进入if块执行了一次向distanciaMaxima的移动,下一帧第一行代码会立刻将物体拉回distanciaMinima方向,导致物体卡在起点。 - 浮点数直接比较存在精度误差:
transform.position.x是浮点值,Vector3.MoveTowards可能无法让位置精确等于目标值,导致切换逻辑触发失败。
修复代码
引入一个变量记录当前移动目标,仅向当前目标移动,到达后切换目标,同时用距离判断替代直接相等比较:
public float distanciaMinima; public float distanciaMaxima; public float velocity; // 记录当前要移动到的目标点 private Vector3 _currentTarget; void Start() { // 初始化目标为其中一个端点 _currentTarget = new Vector3(distanciaMinima, 0, 0); } void Update() { // 每帧只向当前目标移动 transform.position = Vector3.MoveTowards(transform.position, _currentTarget, velocity * Time.deltaTime); // 用极小距离判断是否到达目标(规避浮点数精度问题) if (Vector3.Distance(transform.position, _currentTarget) < 0.01f) { // 切换目标:当前是min则切max,反之切min _currentTarget = _currentTarget.x == distanciaMinima ? new Vector3(distanciaMaxima, 0, 0) : new Vector3(distanciaMinima, 0, 0); } }
简化实现(可选)
如果只是简单的线性往复运动,用Mathf.PingPong可以省去目标切换逻辑,代码更简洁:
public float distanciaMinima; public float distanciaMaxima; public float velocity; void Update() { // 利用PingPong生成0到(distanciaMaxima - distanciaMinima)之间的往复值,再加上最小值得到当前x坐标 float xPos = Mathf.PingPong(Time.time * velocity, distanciaMaxima - distanciaMinima) + distanciaMinima; transform.position = new Vector3(xPos, 0, 0); }
内容的提问来源于stack exchange,提问作者Okabi Rintaro
相关产品推荐
相关产品推荐

