You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 20:17:18