重新启动协程忽略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之前等待几秒钟。
谢谢你的帮助
函数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);
}