我的IEnumerator正在工作但没有等待

问题描述

我正在Unity中制作2D游戏,并在其中使用此代码实例化敌人

void Update()
{
    StartCoroutine("EnemyInstance");
}
IEnumerator EnemyInstance()
{
   float positionRandoming = Random.Range(1f,2f);
   if (positionRandoming < 1.5f)
   {
       Instantiate(enemyPrefeb,new Vector3(-4.3f,-1.45f,1f),position1.rotation,transform.parent);
       enemyScript.pos = 1;
   }
   if (positionRandoming >= 1.5f)
   {
       Instantiate(enemyPrefeb,new Vector3(3.6f,position2.rotation,transform.parent);
       enemyScript.pos = 2;
   }
    yield return new WaitForSeconds(2.4f);
}

在此代码中,IEnumerator方法正在执行其工作,但不会产生返回新的WaitForSeconds的操作。意味着如果我在Unity中运行它,敌人将在每一帧中实例化。 我该怎么解决

解决方法

我不是Unity开发人员,但我相信有两个问题:

  1. 您是从Update调用它的,它经常被调用-因此每次您都在重新启动协程
  2. 您不会循环-因此您的代码基本上只运行一次

我怀疑您想从Start而不是Update调用它,并在方法中放入一个循环:

IEnumerator EnemyInstance()
{
   while (true)
   {
       float positionRandoming = Random.Range(1f,2f);
       if (positionRandoming < 1.5f)
       {
           Instantiate(enemyPrefeb,new Vector3(-4.3f,-1.45f,1f),position1.rotation,transform.parent);
           enemyScript.pos = 1;
       }
       if (positionRandoming >= 1.5f)
       {
           Instantiate(enemyPrefeb,new Vector3(3.6f,position2.rotation,transform.parent);
           enemyScript.pos = 2;
       }
       yield return new WaitForSeconds(2.4f);
   }
}
,

每次调用更新函数都将启动一个新的协程。

您可以添加bool值来检查协程当前是否正在运行。

private bool spawningEnemy = false;

void Update()
{
   if(!spawningEnemy) {
      spawningEnemy = true;
      StartCoroutine("EnemyInstance");  
   }

}

IEnumerator EnemyInstance()
{
   float positionRandoming = Random.Range(1f,2f);
   if (positionRandoming < 1.5f)
   {
        Instantiate(enemyPrefeb,transform.parent);
        enemyScript.pos = 1;
    }
    if (positionRandoming >= 1.5f)
    {
        Instantiate(enemyPrefeb,transform.parent);
        enemyScript.pos = 2;
   }
    yield return new WaitForSeconds(2.4f);
    spawningEnemy = false;
}
,

您想每2.4秒产生一个敌人吗?

yield return new WaitForSeconds(2.4f);上方的代码在每一帧均立即运行,而无需等待,而其下方的代码将等待2.4秒,在您的情况下为空。 将您的代码放在下面,就可以了。

void Update()
{
    StartCoroutine("EnemyInstance");
}

IEnumerator EnemyInstance()
{
   yield return new WaitForSeconds(2.4f);

   float positionRandoming = Random.Range(1f,2f);
   if (positionRandoming < 1.5f)
   {
       Instantiate(enemyPrefeb,transform.parent);
       enemyScript.pos = 1;
   }
   if (positionRandoming >= 1.5f)
   {
       Instantiate(enemyPrefeb,transform.parent);
       enemyScript.pos = 2;
   }
}