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

Unity项目技术求助:实现物体在两个Waypoint间往返移动

实现Unity物体在Waypoint间往返循环移动的解决方案

你的代码当前仅处理了单向移动到最后一个Waypoint的逻辑,未实现返程与循环机制。只需添加方向控制变量,并修改到达Waypoint后的索引更新逻辑,即可实现往返循环效果。

修改后的完整代码

using System.Collections.Generic;
using UnityEngine;

public class ObjSpawnerScript : MonoBehaviour
{
    [SerializeField] List<Transform> waypoints;
    [SerializeField] GameObject ballPrefab;
    int waypointIndex = 0;
    // 控制移动方向:1=向列表末尾前进,-1=向列表开头折返
    int direction = 1;

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

    void Update()
    {
        Move();
    }

    void Move()
    {
        if (waypoints.Count == 0) return;

        var targetPosition = waypoints[waypointIndex].position;
        targetPosition.z = 0f;

        var movementThisFrame = 5.0f * Time.deltaTime;
        transform.position = Vector2.MoveTowards(transform.position, targetPosition, movementThisFrame);

        // 用距离判断是否到达目标,避免浮点数精度误差导致判断失效
        if (Vector2.Distance(transform.position, targetPosition) < 0.01f)
        {
            // 到达端点时反转方向
            if (waypointIndex == 0)
            {
                direction = 1;
            }
            else if (waypointIndex == waypoints.Count - 1)
            {
                direction = -1;
            }

            // 根据方向更新下一个目标Waypoint的索引
            waypointIndex += direction;
        }
    }

    private void spawnBall()
    {
        Instantiate(ballPrefab, transform.position, Quaternion.identity);
    }
}

关键改动说明

  • 添加int direction = 1;变量:通过1和-1的切换,控制物体是向列表末尾前进还是向开头折返。
  • 优化到达判断逻辑:用Vector2.Distance替代直接的==比较,解决浮点数精度误差导致的到达判断失效问题。
  • 更新端点处理逻辑:当物体到达第一个或最后一个Waypoint时,反转移动方向,再通过waypointIndex += direction更新下一个目标点,实现往返循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:45:11