Burdy
Burdy

Reputation: 113

IEnumerator not waiting for seconds

I have created an IEnumerator so that the enemy doesn't kill the player immediately on contact. the code worked fine yesterday, but now the IEnumerator seems to be completely ignored. The Unity 3d console is not showing any errors either.

I have tried to lower the damage amount to check if maybe it was too high but it wasn't the case.

the following is the code:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class enemyAI : MonoBehaviour {
  [SerializeField]
  float chaseDistance = 5.0f;
  public float damageAmount = 1.0f;

  void Update () {
    dist = Vector3.Distance(target.position, transform.position);
    float distance = Vector3.Distance(transform.position, target.position);
    if (distance < chaseDistance )
    {
      AttackPlayer();
    }
  }

  void AttackPlayer()
  {
    agent.updateRotation = false;
    Vector3 direction = target.position - transform.position;
    direction.y = 0;
    transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(direction), turnSpeed * Time.deltaTime); 
    agent.updatePosition = false;
    anim.SetBool("isWalking", false);
    anim.SetBool("isAttacking", true);
    StartCoroutine(AttackTime());
  }

  IEnumerator AttackTime()
  {
    canAttack = false;
    yield return new WaitForSeconds(0.5f);
    Player.singleton.Damage(damageAmount);
    yield return new WaitForSeconds(2.0f);
    canAttack = true;
  }
}
//Player Script {
public class Player : MonoBehaviour {
  public static Player singleton;
  public  float currentHealth;
  public static float maxHealth = 100f;
  public bool isDead = false;

  private void Awake()
  {
    singleton = this;
  }

  // Use this for initialization
  void Start () {
    currentHealth = maxHealth;
  }

  // Update is called once per frame
  void Update () {
    if (currentHealth < 0)
    {
      currentHealth = 0;
    }
  }

  public void Damage(float damage)
  {
    if(currentHealth > 0)
    {
      currentHealth -= damage;
    }
    else
    {
      currentHealth = 0;
    }
  }

  void Dead()
  {
    currentHealth = 0;
    isDead = true;
  }
}

Upvotes: 0

Views: 1135

Answers (2)

Syed Faraz Khalid
Syed Faraz Khalid

Reputation: 173

Try putting "canAttack = false;" beneath yield command

Upvotes: 0

KYL3R
KYL3R

Reputation: 4073

You are starting the "AttackPlayer" Coroutine in "Update()" - so when the enemy is in range, you will start ~60 Coroutines per second. While you want a single one.

You are already setting "canAttack" to "false" - maybe add "&& canAttack" to your range-condition in Update?

Like

    if (distance < chaseDistance && canAttack)
    {

        AttackPlayer();
    }

Upvotes: 2

Related Questions