IEnumerator не ждет секунд - PullRequest
0 голосов
/ 07 мая 2019

Я создал IEnumerator, чтобы противник не убивал игрока сразу же при контакте. вчера код работал нормально, но теперь IEnumerator, похоже, полностью игнорируется. Консоль Unity 3d также не показывает никаких ошибок.

Я попытался уменьшить количество урона, чтобы проверить, не слишком ли оно велико, но это не так.

следующий код:

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

Ответы [ 2 ]

2 голосов
/ 07 мая 2019

Вы запускаете сопрограмму «AttackPlayer» в «Update ()» - поэтому, когда враг находится в пределах досягаемости, вы запускаете ~ 60 сопрограмм в секунду. Пока хочешь одного.

Вы уже устанавливаете "canAttack" в "false" - возможно, добавьте "&& canAttack" к вашему диапазону в Update?

Как

    if (distance < chaseDistance && canAttack)
    {

        AttackPlayer();
    }
0 голосов
/ 07 мая 2019

Попробуйте поставить "canAttack = false;"под командой yield

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...