有条件的内部协程不循环但挂起

时间:2019-03-15 17:45:00

标签: c# unity3d while-loop

我有一个协程,我想暂停2秒。我使用一个while循环来检查initialTimenow之间的差异,以检查持续了多长时间:

IEnumerator MyCoroutine(){
    Debug.Log("Before the counter");

    //`Time.time` returns the number of seconds since app launch (i.e., `72.33448`)
    float initialTime = Time.time;
    Debug.Log("initialTime = " + initialTime);
    float now = initialTime;

    while(now - initialTime < 2.0f){
        yield return null;
        now = Time.time;
        Debug.Log("now = " + now);
    }

    Debug.Log("After the counter");

    //...Stuff that happens after delay
}

由于某种原因,大约运行了1/5次,它不会在循环中完全 hang 挂起,但是将无法执行整个协同程序:在控制台中,我看到{{1 }}仅执行一次,Debug.Log("now = " + now);永远不会发生-我期望适当的while循环挂起可以无限打印Debug.Log("After the counter");

此计时器周围的逻辑可能导致此问题的原因是什么?

编辑:如果可能,我宁愿遵守Unity的使用Debug.Log("now = " + now);StartCoroutine()的规范,而不是StopCoroutine()

1 个答案:

答案 0 :(得分:4)

解决方案非常简单。

首先,您需要像以前一样的IEnumerator,而不是注释中建议的IEnumerable。完全不同的东西。

第二,Unity具有内置功能,可以将协程暂停指定的时间。使用WaitForSeconds(2f)(秒数2)或WaitForSecondsRealtime(2f)

WaitForSeconds“等待” 2秒,同时考虑帧速率。

WaitForSecondsRealTIme“等待” 2秒,而没有考虑帧速率。

IEnumerator MyCoroutine(){
    Debug.Log("Before the counter");

    yield return new WaitForSeconds(2f); 

    Debug.Log("After the counter");

    //...Stuff that happens after delay
}