StartCoroutine开销与Invoke(Unity3D)

时间:2015-10-22 07:57:54

标签: unity3d invoke coroutine ienumerator

我在一个应该在特定时间执行的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 ());
    } 

}

2 个答案:

答案 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秒,但这是另一个故事。