我在一个应该在特定时间执行的Method中比较StartCoroutine和Invoke。据我所知,这两个功能应该花费相同的时间(1秒)。使用调用调用第一个方法在大约1秒内完成,使用协程花费将近2秒!怎么会这样?
private void iincrease_arrow_invoked(){
if (arrow.transform.localScale.x <= 1f) {
arrow.transform.localScale = new Vector3 (arrow.transform.localScale.x + 0.01f, arrow.transform.localScale.y, arrow.transform.localScale.z);
Invoke ("iincrease_arrow_invoked", 0.01f);
}
}
IEnumerator increase_arrow_coroutine(){
yield return new WaitForSeconds (0.01f);
if (arrow.transform.localScale.x <= 1f) {
arrow.transform.localScale = new Vector3 (arrow.transform.localScale.x + 0.01f, arrow.transform.localScale.y, arrow.transform.localScale.z);
StartCoroutine (increase_arrow_coroutine ());
}
}
答案 0 :(得分:1)
IEnumerator
可能会运行多次,而被调用的函数只运行一次。在您的代码中,您还可以通过在IEnumerator
内调用StartCoroutine
来多次运行IEnumerator
。
将InvokeRepeating
与现有IEnumerator
进行比较将是一个更清晰的比较。
答案 1 :(得分:0)
嗯,从技术上讲,它是完全不同的,因为你在协同程序中做任何事情之前等待一整秒,然后你这样做,当它再次执行时,你在等待另一整秒。 Invoke调用立即执行,因为你没有在协程中加上延迟,然后你要求它等待1秒钟并重复。如果你想让协程表现相同,那么就把它编码一样,然后把延迟放在最后。
图表有助于: StartCoroutine - &gt;&gt;&gt;等待1秒 - &gt;&gt;&gt;做这项工作 - &gt;&gt;&gt;重复等待1秒钟。
你想要的是这个: StartCoroutine - &gt;&gt;&gt;做这项工作 - &gt;&gt;&gt;等待1秒 - &gt;&gt;&gt;重复时做的工作
只有 出现 才能以2秒的方式获得它。
在开始比较它们之前,它应该是更多的样子:
WaitForSeconds delay = new WaitForSeconds(0.01f);
IEnumerator increase_arrow_coroutine() {
if(arrow.transform.localScale.x <= 1.0f) {
arrow.transform.localScale = new Vector3(
arrow.transform.localScale.x + 0.01f,
arrow.transform.localScale.y,
arrow.transform.localScale.z);
}
yield return delay;
StartCoroutine(increase_arrow_coroutine());
}
对我来说,除非你在其他地方有其他延误,否则你需要很长时间才会有很多意义。它只需要0.01秒,但这是另一个故事。