重新启动协程忽略yield WaitForSeconds

本文关键字:WaitForSeconds yield 程忽略 重新启动 | 更新日期: 2023-09-27 18:15:08

我有一个IEnumerator为协同程序产生这样的对象

public IEnumerator spawnCoroutine;
private float spawnObstacleTimer;
void Start () {
        spawnObstacleTimer = GameObject.Find("EventSystem").GetComponent<gameManager>().spawnObstacleTimer;
        spawnCoroutine = spawnObsCoroutine(spawnObstacleTimer);
        startSpawnCoroutine();
    }
public IEnumerator spawnObsCoroutine(float timer)
    {
        while (true)
        {
            yield return new WaitForSeconds(timer);
            spawnObs();
        }
    }
public void startSpawnCoroutine()
    {
       StartCoroutine(spawnCoroutine);
    }
public void stopSpawnCoroutine()
    {
        StopCoroutine(spawnCoroutine);
    }

我在start()上启动它,它运行得很好。但是我已经设置了一个碰撞检测,在触发时停止这个协程。这再次运行良好,但它是当我调用OnCollisionExit()重启协程与功能startSpawnCoroutine();立即生成一个新对象并忽略yield return new WaitForSeconds()

这是怎么发生的呢?StopCouroutine应该停止它,当我重新启动它时,它应该在执行spawn之前等待几秒钟。

谢谢你的帮助

重新启动协程忽略yield WaitForSeconds

函数StopCoroutine(spawnCoroutine)可以更好地命名为PauseCoroutine(spawnCoroutine),当您再次调用start时,它将从例程内的最后一个yield重新启动。

更改startSpawnCoroutine()函数以启动例程的新实例,使其"从头开始"

public IEnumerator spawnCoroutine;
private float spawnObstacleTimer;
void Start () {
        spawnObstacleTimer = GameObject.Find("EventSystem").GetComponent<gameManager>().spawnObstacleTimer;
        startSpawnCoroutine();
    }
public IEnumerator spawnObsCoroutine(float timer)
    {
        while (true)
        {
            yield return new WaitForSeconds(timer);
            spawnObs();
        }
    }
public void startSpawnCoroutine()
    {
       //Moved the creation of the IEnumerable in to this function.
       spawnCoroutine = spawnObsCoroutine(spawnObstacleTimer);
       StartCoroutine(spawnCoroutine);
    }
public void stopSpawnCoroutine()
    {
        StopCoroutine(spawnCoroutine);
    }