【问题标题】:How to continue the function only after the coroutine completes?协程完成后如何继续功能?
【发布时间】:2019-06-30 17:20:16
【问题描述】:
void Generate()
{
    StartCoroutine(FallDelayCoroutine());
    print("time3- " + Time.time);
}

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

输出:

时间1- 0
时间3- 0
time2- 3.0146

我想要的输出是:

时间1- 0
时间2- 3
时间3- 3

【问题讨论】:

  • docs.unity3d.com/ScriptReference/… 似乎回答了我认为的您的问题(尽管我没有统一的经验)。特别是第二个例子似乎正是你想要的......
  • 协程的重点在于它这样做...

标签: c# visual-studio unity3d coroutine


【解决方案1】:

作为other answer 使用两个协程的替代方案,您还可以添加一个回调,例如

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

    whenDone?.Invoke();
}

并使用例如调用它一个 lambda 表达式

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

或者用方法

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

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

【讨论】:

    【解决方案2】:

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      相关资源
      最近更新 更多