简体   繁体   English

协程完成后如何继续功能?

[英]How to continue the function only after the coroutine completes?

void Generate()
{
    StartCoroutine(FallDelayCoroutine());
    print("time3- " + Time.time);
}

IEnumerator FallDelayCoroutine()
{     
    print("time1- "+ Time.time);
    yield return new WaitForSeconds(3f);
    print("time2- " + Time.time);
}

Output: 输出:

time1- 0 时间1- 0
time3- 0 时间3-0
time2- 3.0146 时间2- 3.0146

Output that i want is: 我想要的输出是:

time1- 0 时间1- 0
time2- 3 时间2-3
time3- 3 时间3-3

The documentation at https://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html seems to have an example that is almost identical to what you are trying to do: https://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html上的文档似乎有一个与您尝试执行的操作几乎相同的示例:

IEnumerator Start()
{
    // - After 0 seconds, prints "Starting 0.0"
    // - After 2 seconds, prints "WaitAndPrint 2.0"
    // - After 2 seconds, prints "Done 2.0"
    print("Starting " + Time.time);

    // Start function WaitAndPrint as a coroutine. And wait until it is completed.
    // the same as yield WaitAndPrint(2.0);
    yield return StartCoroutine(WaitAndPrint(2.0F));
    print("Done " + Time.time);
}

// suspend execution for waitTime seconds
IEnumerator WaitAndPrint(float waitTime)
{
    yield return new WaitForSeconds(waitTime);
    print("WaitAndPrint " + Time.time);
}

The key point seems to be that their Start routine returns IEnumerator and then uses yield return StartCoroutine(WaitAndPrint(2.0F)); 关键点似乎是他们的Start例程返回IEnumerator,然后使用yield return StartCoroutine(WaitAndPrint(2.0F)); to force it to wait on that method before continuing. 迫使它在继续之前等待该方法。

So the equivalent for you would be: 因此,对您来说将是:

IEnumerator Generate()
{
    yield return StartCoroutine(FallDelayCoroutine());
    print("time3- " + Time.time);
}

As alternative to the other answer using two Coroutines you could also add a callback like eg 作为使用两个协程的另一个答案的替代方案,您还可以添加一个回调,例如

IEnumerator FallDelayCoroutine(Action whenDone)
{     
    print("time1- "+ Time.time);
    yield return new WaitForSeconds(3f);
    print("time2- " + Time.time);

    whenDone?.Invoke();
}

and call it either using eg a lambda expression 并使用例如lambda表达式进行调用

void Generate()
{
    StartCoroutine(FallDelayCoroutine(() => {
        print("time3- " + Time.time);
    }));  
}

or with a method 或用一种方法

void Generate()
{
    StartCoroutine(FallDelayCoroutine(OnFallDelayDone));  
}

private void OnFallDelayDone()
{
    print("time3- " + Time.time);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM