我有一个协程,我想暂停2秒。我使用一个while循环来检查initialTime
和now
之间的差异,以检查持续了多长时间:
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()
。
答案 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
}