- Home /
Question by
0neManArmy · Mar 08, 2019 at 04:38 AM ·
enemyrigidbody2dwaypointkinematicnpc
Making an NPC go up and down in UNITY
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);
}
}
}
Comment
Your answer
![](https://koobas.hobune.stream/wayback/20220612193155im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Rigidbody2D 0 Answers
add waypoint to transform[] 2 Answers
Enemy NPC walks through hills 1 Answer
How do I collide a Kinematic sprite ? 0 Answers