Unity 2D如何实现物体在多个路径点间自动往返移动?
问题根因
- 现有代码停止移动的原因:当物体移动到最后一个路径点时,
waypointIndex自增后等于路径点列表总长度,waypointIndex <= waypoints.Count -1条件不再成立,位移逻辑停止执行。 - 之前编辑器卡死的原因: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
相关产品推荐
相关产品推荐

