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

Unity3D 调用Vector3.MoveTowards时物体仅移动一次就停止如何解决

问题核心原因

  • 你把位移逻辑全部写在了Input.GetKeyDown(KeyCode.Space)的判断块里,这个API仅在空格键按下的单帧触发一次,所以只会执行一次Vector3.MoveTowards,自然只会移动一小段就停止。
  • 你声明了isFinding状态变量但完全没有用来驱动移动逻辑,设置为true后没有对应的分支执行位移。
  • 额外注意:你直接在Update里修改transform.position,如果对象挂载了Rigidbody,这种操作会和物理引擎计算冲突,建议改在FixedUpdate里处理物理相关位移,或者直接操作Rigidbody的位置属性。

修复后代码

public class Test01 : MonoBehaviour
{
    public float speed, stopDist, rotationSpeed, moveSpeed, minSpeed, maxBackSpeed, maxFrontSpeed, turnSpeed, riseSpeed;
    public Transform target;
    private Rigidbody rb;
    private float currentSpeed;

    public bool isFinding = false;
    private PlaySound signal;

    void Start()
    {
        signal = GameObject.FindGameObjectWithTag("Signal").GetComponent<PlaySound>();
        rb = GetComponent<Rigidbody>();
    }

    private void Update()
    {
        // 仅用空格按下切换寻路状态
        if (Input.GetKeyDown(KeyCode.Space))
        {
            isFinding = !isFinding;
            if (isFinding)
            {
                signal.isAlarming = true;
                signal.Sound();
            }
            else
            {
                signal.isAlarming = false;
                SoundManager.instance.StopSound();
            }
        }

        // 处于寻路状态时每帧执行位移逻辑
        if (isFinding)
        {
            float dist = Vector3.Distance(transform.position, target.position);
            if (dist > stopDist)
            {
                transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
            }
            else
            {
                isFinding = false;
                signal.isAlarming = false;
                SoundManager.instance.StopSound();
                StopChasing();
            }
        }
    }
    public void StopChasing()
    {
        // 原方法无实际作用,可保留或删除
    }

    // 如果要适配Rigidbody物理规则,可把位移逻辑移到FixedUpdate,示例如下:
    /*
    private void FixedUpdate()
    {
        if (isFinding)
        {
            float dist = Vector3.Distance(transform.position, target.position);
            if (dist > stopDist)
            {
                Vector3 targetPos = Vector3.MoveTowards(transform.position, target.position, speed * Time.fixedDeltaTime);
                rb.MovePosition(targetPos);
            }
            else
            {
                isFinding = false;
                signal.isAlarming = false;
                SoundManager.instance.StopSound();
                StopChasing();
            }
        }
    }
    */
}

优化建议

  • 如果你的机器人需要碰撞检测,不要直接修改transform.position,改用Rigidbody.MovePosition放在FixedUpdate里执行,避免出现穿模、碰撞不触发的问题。
  • 可以提前计算距离存为变量,避免同一帧多次调用Vector3.Distance浪费性能。
  • 原StopChasing方法没有实际逻辑,不需要可以直接删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:36:01