How to make each object to start moving between the waypoints in his turn using time delay ?

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public class MoveOnCurvedLines : MonoBehaviour
{
    public LineRenderer lineRenderer;
    public List<GameObject> objectsToMove = new List<GameObject>();
    public float speed;
    public bool go = false;
    public bool moveToFirstPositionOnStart = false;

    private Vector3[] positions;
    private Vector3[] pos;
    private int index = 0;
    private bool goForward = true;
    private List<GameObject> objectsToMoveCopy = new List<GameObject>();

    // Start is called before the first frame update
    void Start()
    {
        objectsToMove = GameObject.FindGameObjectsWithTag("New Prefab").ToList();

        pos = GetLinePointsInWorldSpace();

        if (moveToFirstPositionOnStart == true)
        {
            objectsToMove[0].transform.position = pos[index];
        }

        InvokeRepeating("AddNew", 3f, 1f);
    }

    Vector3[] GetLinePointsInWorldSpace()
    {
        positions = new Vector3[lineRenderer.positionCount];
        //Get the positions which are shown in the inspector
        lineRenderer.GetPositions(positions);


        //the points returned are in world space
        return positions;
    }

    // Update is called once per frame
    void Update()
    {
        if (go == true)
        {
            Move();
        }
    }

    void Move()
    {
        for (int i = 0; i < objectsToMoveCopy.Count; i++)
        {
            Vector3 newPos = objectsToMoveCopy[i].transform.position;
            float distanceToTravel = speed * Time.deltaTime;

            bool stillTraveling = true;
            while (stillTraveling)
            {
                Vector3 oldPos = newPos;
                newPos = Vector3.MoveTowards(oldPos, pos[index], distanceToTravel);
                distanceToTravel -= Vector3.Distance(newPos, oldPos);
                if (newPos == pos[index]) // Vector3 comparison is approximate so this is ok
                {
                    // when you hit a waypoint:
                    if (goForward)
                    {
                        bool atLastOne = index >= pos.Length - 1;
                        if (!atLastOne) index++;
                        else { index--; goForward = false; }
                    }
                    else
                    { // going backwards:
                        bool atFirstOne = index <= 0;
                        if (!atFirstOne) index--;
                        else { index++; goForward = true; }
                    }
                }
                else
                {
                    stillTraveling = false;
                }
            }

            objectsToMoveCopy[i].transform.position = newPos;
        }
    }

    void AddNew()
    {
        foreach(var objToMove in objectsToMove)
        {
            objectsToMoveCopy.Add(objToMove);
        }
    }
}

I want that each 3 seconds another object will start move between the waypoints in the end all the objects will move between the waypoints with time space between them of 3 seconds.

I tried to use InvokeRepeating and AddNew method but still all the objects are moving at the same time in the waypoints as one group and not starting every 3 seconds one by one as I wanted.

I want to make it like a queue logic the first object will start moving between the wapyoints once running the game the next object to move will start running between the waypoints 3 seconds after the first one the third one after 3 seconds the second started and so on each 3 seconds send then next object to move between the waypoints and make them keep running between the waypoints.

Looks to me like your problem is due to the fact that a single call to AddNew adds the entire list in objectsToMove to the objectsToMoveCopy list. Maybe this would work: replace Line 34 with StartCoroutine(AddNew());, and change AddNew to the below.

IEnumerator AddNew()
{
    WaitForSeconds waitThreeSeconds = new WaitForSeconds(3);

    foreach (var objToMove in objectsToMove)
    {
        yield return waitThreeSeconds;
        objectsToMoveCopy.Add(objToMove);
    }
}
1 Like

That wasn’t the problem you originally asked us about. I solved the problem you started with. If the behavior of the objects is still not what you want, now that they are being created on the three-second interval you wanted, you are going to have to deal with that as a separate problem.

1 Like