重新启动协程忽略 yield WaitForSeconds

Restarting a Coroutine ignore the yield WaitForSeconds

我有一个协程的 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() 上启动它 运行 很好。但是我已经进行了碰撞检测以在触发时停止此协程。同样,这是 运行ning 很好,但是当我调用 OnCollisionExit() 时,它使用函数 startSpawnCoroutine() 重新启动协程;立即生成一个新对象并忽略 yield return new WaitForSeconds()

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

感谢您的帮助

函数 StopCoroutine(spawnCoroutine) 最好命名为 PauseCoroutine(spawnCoroutine),当您再次调用 start 时,它会从例程中的最后一个 yield 重新开始。

更改您的 startSpawnCoroutine() 函数以启动例程的新实例以将其设置为 "start from scratch"

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);
    }