重新启动协程忽略 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);
}
我有一个协程的 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);
}