- Home /
Looping Between Waypoints
While putting together my own AI mostly from scratch, I've hit a bump in the patrol state I have setup. After reaching one waypoint, my AI won't continue to the next one, despite being quite sure that my conditions to set the next point trigger and that I set the next one properly. I'll copy the piece of code in question below:
 public override void Update(enemyAI_FSM enemy)
     {
         // Check how close the enemy is to the player
         if (enemy.distance <= enemy.lookRadius)
         {
             enemy.TransitionToState(enemy.ShootState);
         }
 
         // If the Waypoint Index is set to less than or equal to the total number of waypoints, start moving toward the currently selected waypoint
         if (waypointIdx <= enemy.waypointList.Length && pointDistance > enemy.stopDistance)
         {
             enemy.transform.position = Vector3.MoveTowards(enemy.transform.position, currentPoint.transform.position, enemy.moveSpeed * Time.deltaTime);
         }
         // Then check if the waypoint has been reached, and select the next one
         else if (pointDistance <= enemy.stopDistance)
         {
             Debug.Log("Waypoint reached");
             if (waypointIdx < enemy.waypointList.Length)
             {
                 waypointIdx++;
             }
             else if (waypointIdx >= enemy.waypointList.Length)
             {
                 waypointIdx = 0;
             }
             currentPoint = enemy.waypointList[waypointIdx];
         }
     }
So, is there something obvious I'm missing? Thank you to anyone who can help
Where do you set pointDistance? Are you sure this is updating properly?
Now that you mention it, I see that issue. I had it in my EnterState method. It wasn't updating at all. I even made this mistake once already
Answer by bhavinbhai2707 · Dec 24, 2019 at 06:41 PM
I don't know what the pointDistance is? But most probably it was the issue as pointDistance > enemy.stopDistance is always set to be true in that if condition. The else if part never gets executed. I copy-pasted your code in unity and modified it a bit (because I didn't have all the variables and it's values)
 public class WaypointScript : MonoBehaviour
 {
     private int waypointIdx = 0;
     public Transform[] waypointList;
     private float stopDistance = 3, moveSpeed = 10;   //i am assuming stopDistance is the distance from your waypoint where the waypointIdx should update
     private Transform currentPoint;
   private void Start()
     {
         currentPoint = waypointList[0];
     }
 
     private void Update()
     {
         if (waypointIdx <= waypointList.Length)
         {
             transform.position = Vector3.MoveTowards(transform.position, currentPoint.transform.position, moveSpeed * Time.deltaTime);
             if (Vector3.Distance(transform.position, waypointList[waypointIdx].transform.position) <= stopDistance)
             {
                 Debug.Log("Waypoint reached");
                 Debug.Log(waypointIdx);
                 if (waypointIdx < waypointList.Length - 1)
                 {
                     waypointIdx++;
                 }
                 else if (waypointIdx >= waypointList.Length - 1)
                 {
                     waypointIdx = 0;
                 }
 
                 currentPoint = waypointList[waypointIdx];
             }
         }
 
     }
 }
 
I Tested the code. It works like a charm. I hope it helps a bit.
Keep learning :)
Your answer
 
 
              koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                