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);
}
}
}
↧