Как продолжить функцию только после завершения сопрограммы? - PullRequest
0 голосов
/ 06 февраля 2019
void Generate()
{
    StartCoroutine(FallDelayCoroutine());
    print("time3- " + Time.time);
}

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

Выход:

time1- 0
time3- 0
time2- 3.0146

Требуемый вывод:

время1- 0
время2- 3
время3- 3

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

В качестве альтернативы другому ответу с использованием двух сопрограмм вы также можете добавить обратный вызов, например,

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

    whenDone?.Invoke();
}

, и вызывать его, используя, например, лямбда-выражение

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

или методом

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

private void OnFallDelayDone()
{
    print("time3- " + Time.time);
}
0 голосов
/ 06 февраля 2019

Документация в 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);
}

Ключевым моментом является то, что их подпрограмма Startвозвращает IEnumerator и затем использует yield return StartCoroutine(WaitAndPrint(2.0F));, чтобы заставить его ждать этого метода, прежде чем продолжить.

Таким образом, эквивалент для вас будет:

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