IEnumerator not waiting before relooping.

I have an enemy who in the update fires projectiles at the player if in range every X seconds however he never waits between shots. I’ve checked with the print statements that the projectile is fired multiple times before the WaitForSeconds happens. Can someone explain what I’ve done wrong.

if (distanceToPlayer <= attackRange)
{
    aiCharControl.agent.isStopped = true;
    anim.SetFloat("BlendY", 0);
    //Fire or Attack
    StartCoroutine(FireProjectile(target));
}

private IEnumerator FireProjectile(Transform target)
{

    GameObject projectile = Instantiate(projectileToUse, projectileSpawnPoint.position, Quaternion.identity) as GameObject;
    Projectile projComponent = projectile.GetComponent<Projectile>();
    float projSpeed = projComponent.Speed;
    Vector3 distanceToPlayer = (target.transform.position - projectileSpawnPoint.transform.position).normalized;
    projectile.GetComponent<Rigidbody>().velocity = distanceToPlayer * projSpeed;
    projectile.transform.LookAt(target);
    projComponent.Damage = projectileDamage;
    print(Time.time + " Before wait");
    yield return new WaitForSeconds(timeBetweenShots);
    print(Time.time + " After wait");
}

I assume you are checking if (distanceToPlayer <= attackRange) in an Update loop, this means StartCoroutine(FireProjectile(target)); is being called multiple times so the projectile is shot multiple times.

What you can do is have a bool canShoot variable and change it so that the coroutine is only called when canShoot is true

 if (distanceToPlayer <= attackRange)
 {
     aiCharControl.agent.isStopped = true;
     anim.SetFloat("BlendY", 0);
     //Fire or Attack
     if(canShoot)
         StartCoroutine(FireProjectile(target));
 }

In your FireProjectile coroutine add in a line that sets canShoot to false, and set it back to true after the WaitForSeconds is finished

 private IEnumerator FireProjectile(Transform target)
 {
     //All your previous code here

     //New line of code here
     canShoot = false;

     print(Time.time + " Before wait");
     yield return new WaitForSeconds(timeBetweenShots);
     print(Time.time + " After wait");

     canShoot = true;
 }

Hope this helps