gpt4 book ai didi

c# - 重新启动协程忽略 yield WaitForSeconds

转载 作者:行者123 更新时间:2023-11-30 23:19:29 27 4
gpt4 key购买 nike

我有一个协程的 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 应该停止这一切,当我重新启动它时,它应该在执行生成之前等待几秒钟。

谢谢你的帮助

最佳答案

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

关于c# - 重新启动协程忽略 yield WaitForSeconds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40264484/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com