我的 IEnumerator 正在工作但没有等待
My IEnumerator Is working but not waiting
我正在 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, -1.45f, 1f), position2.rotation, transform.parent);
enemyScript.pos = 2;
}
yield return new WaitForSeconds(2.4f);
}
在此代码中,IEnumerator 方法正在执行它们的工作,但不会产生 return 新的 WaitForSeconds。意味着如果我 运行 它在 Unity 中,敌人会在每一帧中实例化。
我该如何解决?
我不是Unity开发者,但我认为有两个问题:
- 您从经常调用的
Update
调用它 - 所以每次,您都会再次启动协同程序
- 你没有循环 - 所以你的代码基本上只运行一次
我怀疑您想从 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, -1.45f, 1f), 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, new Vector3(-4.3f, -1.45f, 1f), position1.rotation, transform.parent);
enemyScript.pos = 1;
}
if (positionRandoming >= 1.5f)
{
Instantiate(enemyPrefeb, new Vector3(3.6f, -1.45f, 1f), position2.rotation, 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, new Vector3(-4.3f, -1.45f, 1f), position1.rotation, transform.parent);
enemyScript.pos = 1;
}
if (positionRandoming >= 1.5f)
{
Instantiate(enemyPrefeb, new Vector3(3.6f, -1.45f, 1f), position2.rotation, transform.parent);
enemyScript.pos = 2;
}
}
我正在 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, -1.45f, 1f), position2.rotation, transform.parent);
enemyScript.pos = 2;
}
yield return new WaitForSeconds(2.4f);
}
在此代码中,IEnumerator 方法正在执行它们的工作,但不会产生 return 新的 WaitForSeconds。意味着如果我 运行 它在 Unity 中,敌人会在每一帧中实例化。 我该如何解决?
我不是Unity开发者,但我认为有两个问题:
- 您从经常调用的
Update
调用它 - 所以每次,您都会再次启动协同程序 - 你没有循环 - 所以你的代码基本上只运行一次
我怀疑您想从 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, -1.45f, 1f), 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, new Vector3(-4.3f, -1.45f, 1f), position1.rotation, transform.parent);
enemyScript.pos = 1;
}
if (positionRandoming >= 1.5f)
{
Instantiate(enemyPrefeb, new Vector3(3.6f, -1.45f, 1f), position2.rotation, 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, new Vector3(-4.3f, -1.45f, 1f), position1.rotation, transform.parent);
enemyScript.pos = 1;
}
if (positionRandoming >= 1.5f)
{
Instantiate(enemyPrefeb, new Vector3(3.6f, -1.45f, 1f), position2.rotation, transform.parent);
enemyScript.pos = 2;
}
}