【问题标题】: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
【问题讨论】:
标签:
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);
}