如何等待Coroutine回调执行?

时间:2018-04-10 00:24:40

标签: c# unity3d

我想等待StartCoroutine回调被执行。 谁知道怎么做?

tools.jar

3 个答案:

答案 0 :(得分:3)

您不能也不应该尝试等待或屈服于协程函数从协程函数(getXXX函数)返回。它将阻止该非协程功能,直到此函数返回阻止其他Unity脚本运行。

要等待YYY函数中的协程函数(getXXX),您还必须使用正在进行调用的函数并在协程函数中等待。在这种情况下,这是YYY函数,因此它应该是一个corutine函数,然后你可以yield

public IEnumerator getXXX()
{
    float result = 0f;
    yield return StartCoroutine(YYY((r) => result = r)); // how to wait this?

    //Use the result variable
    Debug.Log(result);
}

OR

如果你不想让getXXX函数成为一个协同程序函数,那么不要试图在那里等待。您仍然可以使用YYY协同程序函数的结果,但不要尝试返回结果。只需用它来做你想做的任何事情:

public void doSomethingXXX()
{
    StartCoroutine(YYY((result) =>
    {
        //Do something with the result variable
        Debug.Log(result);

    }));
}

使用协同程序的想法是能够在多个框架上执行某些操作。 void函数将在一帧中完成。你不能在void或非IEnumerator / coroutine函数中产生/等待。

答案 1 :(得分:2)

你只能在协程内等待。要做到这一点,你的getXXX()方法也应该是一个协程。像这样:

public float someOtherMethod()
{
    float result;
    StartCoroutine(getXXX(out result));
    return result;
}

IEnumerator getXXX(out float result)
{
    //more code here...
    yield return StartCoroutine(YYY((r) => result = r));
    //more code here...
}

IEnumerator YYY(System.Action<float> callback)
{
    //your logic here...
}

答案 2 :(得分:0)

我找到了一些你可以调用该类并使用这段代码中的方法并修改使用它的方法与你的代码非常相似但不太复杂:

using UnityEngine;
using System.Collections;

public class WaitForSecondsExample : MonoBehaviour
{
   void Start()
   {
        StartCoroutine(Example());
   }

    IEnumerator Example()
    {
        print(Time.time);
        yield return new WaitForSeconds(5);
        print(Time.time);
    }
 }

此代码取自:https://docs.unity3d.com/ScriptReference/WaitForSeconds.html 从那里的例子 5是它等待的时间,除非你想根据某些东西动态地做这件事。取决于你想做什么。但是请注意他们如何在StartCoroutine(Example())中调用方法Example(),然后调用IEnumerator Example()并在那里调用WaitForSeconds(5);这将使StartCoroutine等待5秒钟。这可以是硬编码的,也可以通过在IEnumerator中调用该类中的另一个方法来动态等待示例()这只是您可以攻击它的众多方法之一。再取决于你想做什么。实际上,你甚至可能最好把它变成一个方法,每次像

那样将值传递给方法
    IEnumerator Example(float flSeconds)
    {
        print(Time.time);
        yield return new WaitForSeconds(flSeconds);
        print(Time.time);
    }
通过这种方式你可以传递你的内容         LinkedList list = new LinkedList(); 每次