0

So I have this code, it is to make an enemy up and then down using waypoints, it actually works, but for a strange reason after some looping between the waypoints it goes all the way up to the infinity passing the top waypoint (wp0), why is this happening??? I've been toying whith the code but nothing get the appropiate behaviour.

The code is for an NPC which has a kinematic rigidbody, it "floats" in the air and is supossed to fly up and down like the flying koopas in the mario bros game...

public GameObject[] myWaypoints;
float direction = 1f; //1 up, 0 stop. -1 down.
int _myWaypointIndex = 0; // used as index for My_Waypoints
float _moveTime;
float _vx = 0f;
bool _moving = true;
public float waitAtWaypointTime = 1f;   // how long to wait at a waypoint
public bool loopWaypoints = true; // should it loop through the waypoints

void EnemyMovement()
{
    // if there isn't anything in My_Waypoints
    if ((myWaypoints.Length != 0) && (_moving))
    {

        // make sure the enemy is facing the waypoint (based on previous movement)
        Flip(_vx);

        // determine distance between waypoint and enemy
        _vx = myWaypoints[_myWaypointIndex].transform.position.y - _transform.position.y;

        direction = Mathf.Sign(myWaypoints[_myWaypointIndex].transform.position.y);
        Debug.Log("Direction = " + direction);

        // if the enemy is close enough to waypoint, make it's new target the next waypoint
        if (Mathf.Abs(_vx) <= 0.05f)
        {
            Debug.Log("changin to the next waypoint");

            // At waypoint so stop moving
            _rigidbody.velocity = new Vector2(0, 0);

            // increment to next index in array
            _myWaypointIndex++;

            Debug.Log("_myWaypointIndex = " + _myWaypointIndex);
            Debug.Log("Length = " + myWaypoints.Length);
            direction *= -1;
            Debug.Log("New Direction = " + direction);

            // reset waypoint back to 0 for looping
            if (_myWaypointIndex >= myWaypoints.Length)
            {
                Debug.Log("True");
                if (loopWaypoints)
                {
                    _myWaypointIndex = 0;
                }
                else
                {
                    _moving = false;
                }
            }

            // setup wait time at current waypoint
            _moveTime = Time.time + waitAtWaypointTime;
        }
        else
        {
            // enemy is moving
            _animator.SetBool("Moving", true);

            // Set the enemy's velocity to moveSpeed in the y direction.
            _rigidbody.velocity = new Vector2(0.0f, _transform.localScale.y * moveSpeed * direction);

        }

    }
}
DomCR
  • 533
  • 4
  • 19
DarkVader
  • 41
  • 1
  • 6

3 Answers3

0

I think that the problem is when you reset the _myWaypointIndex to 0, loopWaypoints is in some other function, but the else doesn't make the NPC to stop, so maybe keeps moving to the next waypoint that it can not find beacause the index haven't been reset so the _vx distance will never be 0, try to check if the loopWaypoints change the value when you want, the error maybe there.

        if (loopWaypoints)
        {
            _myWaypointIndex = 0;
        }
        else
        {
            _moving = false;
            //Stop the movment 
            moveSpeed = 0;
        }
DomCR
  • 533
  • 4
  • 19
0

Maybe: what happens if the enemy passes the last waypoint and _vx> 0.05f?

it wouldn't be catched in:

if (Mathf.Abs(_vx) <= 0.05f)
0

The problem is that in Mathf.abs(_vx) <= 0.05f _vx value is never reaching below 0.05f.

What u should do is attach a trigger at waypoint and change the waypoint coordinate when player come in contact with that trigger.

Or do this.

_vx =   Mathf.Abs(myWaypoints 
[_myWaypointIndex].  
transform.position.y) - 
Mathf.Abs(_transform.position.y);

//And then write.

if (_vx <= 0.5f)
   // change coordinate.'''
Naresh Bisht
  • 645
  • 6
  • 16