繁体   English   中英

IEnumerator不等待秒

[英]IEnumerator not waiting for seconds

我创建了一个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;
  }
}

您正在“ Update()”中启动“ AttackPlayer”协程-因此,当敌人在射程内时,您将每秒启动约60个协程。 当您想要一个。

您已经将“ canAttack”设置为“ false”-也许在Update的范围条件中添加“ && canAttack”?

喜欢

    if (distance < chaseDistance && canAttack)
    {

        AttackPlayer();
    }

尝试输入“ canAttack = false;” 低于产量命令

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM