void SetEachObjetPathOnWayPoint()
    {
        foreach (Transform movingObject in _movingObjects)
        {
            Object_Waypoint_Data wp = movingObject.GetComponent <Object_Waypoint_Data>();


            switch (type)
            {
            case MovementSpace.Vector_3D:
                movingObject.position = Vector3.MoveTowards(movingObject.position,
                                                            _wayPoint[wp.myTarget].position, wp.speed * Time.fixedDeltaTime);

                if (Vector3.Distance(movingObject.position, _wayPoint[wp.myTarget].position) < .2f)
                {
                    movingObject.position = _wayPoint[wp.myTarget].position;

                    UpdateWayPoint(wp, movingObject);
                }
                break;

            case MovementSpace.Vector_2D:
                movingObject.position = Vector2.MoveTowards(movingObject.position,
                                                            _wayPoint[wp.myTarget].position, wp.speed * Time.fixedDeltaTime);

                if (Vector2.Distance(movingObject.position, _wayPoint[wp.myTarget].position) < .2f)
                {
                    movingObject.position = _wayPoint[wp.myTarget].position;

                    UpdateWayPoint(wp, movingObject);
                }
                break;
            }
        }
    }
    void UpdateWayPoint(Object_Waypoint_Data wp, Transform movingObject)
    {
        switch (movementType)
        {
        case MovementType.Back_And_Forth:
            if (wp.reverse)
            {
                wp.myTarget--;

                if (wp.myTarget < 0)
                {
                    wp.reverse  = false;
                    wp.myTarget = 1;
                }
            }
            else if (wp.reverse == false)
            {
                wp.myTarget++;

                if (wp.myTarget > _wayPoint.Count - 1)
                {
                    wp.reverse  = true;
                    wp.myTarget = _wayPoint.Count - 1;
                }
            }

            break;

        case MovementType.Go_Back_To_Start:
            wp.myTarget++;

            if (wp.myTarget > _wayPoint.Count - 1)
            {
                movingObject.position = _wayPoint[0].position;
                wp.myTarget           = 1;
            }

            break;

        case MovementType.Loop:
            wp.myTarget++;
            if (wp.myTarget > _wayPoint.Count - 1)
            {
                wp.myTarget = 0;
            }
            break;
        }
    }
    }         // end loop

    void ReturnToStart(float t_spreadAmount)
    {
        // initial direction for alligining objects
        Vector3 dir = _wayPoint[1].position - _wayPoint[0].position;

        for (int i = 0; i < _movingObjects.Count; i++)
        {
            _movingObjects[i].position = _wayPoint[0].position + (Vector3.Normalize(dir) * (t_spreadAmount * i));
        }

        foreach (Transform _object in _movingObjects)
        {
            Object_Waypoint_Data owd = _object.GetComponent <Object_Waypoint_Data>();
            owd.myTarget = 1; // increade their target as they have moved from pi

            int safetyPoint = 0;

            // while distance of me from my previous target is greater than the target from start point
            while ((Vector3.Distance(_object.position, _wayPoint[owd.myTarget - 1].position) >
                    Vector3.Distance(_wayPoint[owd.myTarget - 1].position, _wayPoint[owd.myTarget].position)) && safetyPoint < 10)
            {
                // store amount of distance off object is from current target
                float offsetDistance = Vector3.Distance(_object.position, _wayPoint[owd.myTarget].position);

                // dir = target.pos - start.pos
                Vector3 direction = _wayPoint[owd.myTarget + 1].position - _wayPoint[owd.myTarget].position;


                // set new position
                _object.position = _wayPoint[owd.myTarget].position + (Vector3.Normalize(direction) * offsetDistance);
                owd.myTarget++;

                // on the off chance we have an endless while loop
                safetyPoint++;
            }
        } // end foreach loop
    }     // end return to start function
    void Loop(float t_spreadAmount)
    {
        // initial direction for alligining objects
        Vector3 dir = _wayPoint[1].position - _wayPoint[0].position;

        for (int i = 0; i < _movingObjects.Count; i++)
        {
            _movingObjects[i].position = _wayPoint[0].position + (Vector3.Normalize(dir) * (t_spreadAmount * i));
        }


        foreach (Transform _object in _movingObjects)
        {
            Object_Waypoint_Data owd = _object.GetComponent <Object_Waypoint_Data>();
            owd.myTarget = 1; // increade their target as they have moved from pi

            int safetyPoint = 0;

            // initialise values
            float myDistance            = Vector3.Distance(_object.position, _wayPoint[owd.myTarget - 1].position);
            float distanceBetweenPoints = Vector3.Distance(_wayPoint[owd.myTarget - 1].position, _wayPoint[owd.myTarget].position);

            // while distance of me from my previous target is greater than the target from start point
            while ((myDistance > distanceBetweenPoints) && safetyPoint < 10)
            {
                // store amount of distance off object is from current target
                float offsetDistance = Vector3.Distance(_object.position, _wayPoint[owd.myTarget].position);

                if (owd.myTarget < _wayPoint.Count - 1)
                {
                    Debug.Log(owd.name + " working");
                    // dir = target.pos - start.pos
                    Vector3 direction = _wayPoint[owd.myTarget + 1].position - _wayPoint[owd.myTarget].position;


                    // set new position
                    _object.position = _wayPoint[owd.myTarget].position + (Vector3.Normalize(direction) * offsetDistance);
                    owd.myTarget++;

                    // update new values
                    myDistance            = Vector3.Distance(_object.position, _wayPoint[owd.myTarget - 1].position);
                    distanceBetweenPoints = Vector3.Distance(_wayPoint[owd.myTarget - 1].position, _wayPoint[owd.myTarget].position);
                }
                else
                {
                    Debug.Log(owd.name + " dfdf");
                    // dir = target.pos - start.pos we go back to start
                    Vector3 direction = _wayPoint[0].position - _wayPoint[owd.myTarget].position;

                    // set new position
                    _object.position = _wayPoint[owd.myTarget].position + (Vector3.Normalize(direction) * offsetDistance);
                    owd.myTarget     = 0;


                    myDistance            = Vector3.Distance(_object.position, _wayPoint[_wayPoint.Count - 1].position);
                    distanceBetweenPoints = Vector3.Distance(_wayPoint[_wayPoint.Count - 1].position, _wayPoint[owd.myTarget].position);
                }



                // on the off chance we have an endless while loop
                safetyPoint++;
            } // end while
        }     // end foreach
    }         // end loop