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

Unity 2D如何实现物体在多个路径点间自动往返移动?

问题根因
  1. 现有代码停止移动的原因:当物体移动到最后一个路径点时,waypointIndex 自增后等于路径点列表总长度,waypointIndex <= waypoints.Count -1 条件不再成立,位移逻辑停止执行。
  2. 之前编辑器卡死的原因:Unity 引擎的Update方法本身就是每帧执行一次的内置循环,你自行添加do/while死循环、递归调用Move方法会导致当前帧永远无法执行结束,主线程被阻塞,自然会触发卡死。不需要手动写死循环控制位移,直接依赖引擎的帧循环即可。
支持多点位往返的修改后代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ZombiePathing : MonoBehaviour
{
    [SerializeField] List<Transform> waypoints;
    [SerializeField] float moveSpeed = 2f;
    int waypointIndex = 0;
    // 新增变量控制移动方向:true为正向从第一个点往最后一个点走,false为反向往回走
    private bool isForward = true;

    void Start()
    {
        transform.position = waypoints[waypointIndex].transform.position;
    }

    // Update is called once per frame
    void Update()
    {
        Move();
    }

    private void Move()
    {
        var targetPosition = waypoints[waypointIndex].position;
        var movementThisFrame = moveSpeed * Time.deltaTime;
        transform.position = Vector2.MoveTowards(transform.position, targetPosition, movementThisFrame);
        
        // 到达当前目标点后切换下一个点位
        if (transform.position == targetPosition)
        {
            if (isForward)
            {
                waypointIndex++;
                // 走到最后一个点,切换反向
                if (waypointIndex >= waypoints.Count)
                {
                    waypointIndex = waypoints.Count - 2;
                    isForward = false;
                }
            }
            else
            {
                waypointIndex--;
                // 走到第一个点,切换正向
                if (waypointIndex < 0)
                {
                    waypointIndex = 1;
                    isForward = true;
                }
            }
        }
     }
}
逻辑说明
  • 新增的isForward变量用来记录当前移动方向,默认正向从第一个路径点向最后一个路径点移动
  • 到达当前目标点后,根据当前方向判断索引的增减:正向则索引加1,反向则索引减1
  • 当索引超出路径点列表边界时,自动切换移动方向,同时修正索引到下一个要前往的点位,实现往返效果
  • 完全兼容多点位扩展,后续只需要在Inspector面板的waypoints列表里添加更多路径点即可,不需要修改代码逻辑
  • 如果不需要往返,而是要循环从第一个点重新开始移动,只需要把到达最后一个点后的逻辑改成waypointIndex = 0即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:18:03