You need to enable JavaScript to run this app. Unity协程调用Vector3.MoveTowards时对象直接瞬移而非逐帧移动如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Unity协程调用Vector3.MoveTowards时对象直接瞬移而非逐帧移动如何解决

问题原因
  • 核心错误是yield return null的放置位置错误:当前代码将暂停指令放在了while循环之外,协程启动后会在同一帧内反复执行while循环的移动逻辑,直到两个对象间距≤1时才会触发协程暂停。所有移动操作在一帧内全部执行完毕,就会表现为对象直接瞬移到目标位置。
  • 额外问题:你声明的step变量没有被实际使用,当前移动速度被硬编码为1单位/秒,也不符合你需要的高于常规移动速度的需求。
修复方案

首先调整yield return null的位置到while循环内部,确保每执行一次移动就暂停协程,下一帧再继续执行后续逻辑,实现逐帧平滑移动的效果。其次将移动速度改为可配置的变量,方便你调整到所需的高移动数值。
修复后的代码示例:

// 可在Inspector面板调整,设置为你需要的高于常规移动的跳跃速度即可
public float jumpSpeed = 10f;

IEnumerator Qjump()
{
    while (Vector3.Distance(positionofenemy, transform.position) > 1)
    {
        float step = jumpSpeed * Time.deltaTime;
        transform.position = Vector3.MoveTowards(transform.position, positionofenemy, step);
        // 单次移动执行完成后暂停,等待下一帧继续执行
        yield return null;
    }
}

补充说明:如果你需要跳跃过程中跟随移动的目标对象,不要提前缓存positionofenemy,可以在while循环内每次获取目标对象的最新位置,避免跳到目标的旧坐标上。

内容的提问来源于stack exchange,提问作者Lee Geng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 21:54:06