为了账号安全,请及时绑定邮箱和手机立即绑定

无法在 Unity 中停止协程

无法在 Unity 中停止协程

C#
HUH函数 2022-11-21 16:58:13
我试图阻止玩家死亡时产生的波浪,但我似乎无法阻止协程。我真的不知道如何再攻击它,因为添加 if 语句和 break 不起作用。如何调用 StopCoroutine 并停止例程?我需要介绍新方法吗?void Start () {    gameOver = false;    StartCoroutine (SpawnWaves());}void Update(){    if (gameOver)    {        StopCoroutine(SpawnWaves());    }  }IEnumerator SpawnWaves(){    yield return new WaitForSeconds(startWait);    while (true)    {        for (int i = 0; i < hazardCount; i++)        {            GameObject enemy = enemies[Random.Range(0, enemies.Length)];            Instantiate(enemy, spawnPosition1, spawnRotation1);            Instantiate(enemy, spawnPosition2, spawnRotation2);            Instantiate(enemy, spawnPosition3, spawnRotation3);            Instantiate(enemy, spawnPosition4, spawnRotation4);            Instantiate(enemy, spawnPosition5, spawnRotation5);            Instantiate(enemy, spawnPosition6, spawnRotation6);            yield return new WaitForSeconds(spawnWait);        }        yield return new WaitForSeconds(waveWait);        enemies[0].GetComponent<EnemyBehviour>().currentHealth *= enemyHealthMultiplier;    }}
查看完整描述

4 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

  1. 当玩家死亡时,您需要将 gameOver 设置为 True

  2. 您还需要添加逻辑以将 while 循环更改为 false 以退出 while 循环。

例如在 while 循环内设置gameOver = truewhen并设置currentHealth == 0while(gameOver == false)


查看完整回答
反对 回复 2022-11-21
?
MM们

TA贡献1886条经验 获得超2个赞

我认为问题可能是当您调用 StopCoroutine() 时,您并没有指示它停止协程的特定实例。相反,您需要存储对协程的引用并将其作为参数传递给您的 Stop。


IEnumerator wavecoroutine = SpawnWaves();

StartCoroutine(wavecoroutine);


...


StopCoroutine(wavecoroutine);


查看完整回答
反对 回复 2022-11-21
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

ryeMoss 实际上有正确的答案。您不需要更改 while 循环的条件,而是需要确保将参考值传递给该StopCoroutine方法。您可以在文档中看到这正是他们正在做的事情。


问题是什么时候SpawnWaves调用它返回一个新IEnumerator的,当你试图阻止它时,这显然不是你想要的,哈哈。


Start只需在您的方法内部更改为


gameOver = false;

waves = SpawnWaves(); <-- or whatever you want to call it

StartCoroutine(waves); <-- using a reference

然后传递waves给StopCoroutine.


始终仔细阅读文档;在学习新的库、框架等时,他们是你最好的朋友。:)


查看完整回答
反对 回复 2022-11-21
?
慕的地10843

TA贡献1785条经验 获得超8个赞

完全修复感谢@AlexG 的指导


void Start () {

    gameOver = false;

    StartCoroutine (SpawnWaves());

}


IEnumerator SpawnWaves()

{

    yield return new WaitForSeconds(startWait);

    while (gameOver != true)

    {

        for (int i = 0; i < hazardCount; i++)

        {

            if(gameOver)break;

            GameObject enemy = enemies[Random.Range(0, enemies.Length)];

            Instantiate(enemy, spawnPosition1, spawnRotation1);

            Instantiate(enemy, spawnPosition2, spawnRotation2);

            Instantiate(enemy, spawnPosition3, spawnRotation3);

            Instantiate(enemy, spawnPosition4, spawnRotation4);

            Instantiate(enemy, spawnPosition5, spawnRotation5);

            Instantiate(enemy, spawnPosition6, spawnRotation6);

            yield return new WaitForSeconds(spawnWait);

        }

        yield return new WaitForSeconds(waveWait);

        enemies[0].GetComponent<EnemyBehviour>().currentHealth *= eenter code herenemyHealthMultiplier;

    }

}


查看完整回答
反对 回复 2022-11-21
  • 4 回答
  • 0 关注
  • 174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信