如何在 Unity3d 协程中获取 return 值(int)?

How can i get return value(int) in Unity3d coroutine?

如何在协程中获取return值? 但是,getElapseSecond() 函数不应该在协程内。

 WWW www;
public IEnumerator requestNowTime()
{
    www = new WWW(url);

    yield return www;
}


public IEnumerator getNowTime()
{
    yield return StartCoroutine(requestNowTime());
}

public int getElapseSecond()
{
    StartCoroutine(getNowTime()); 
    // You are trying to load data from a www stream which has not completed the download yet.

    int totalSeconds = 0;
    DateTime dt = Convert.ToDateTime(www.text);
    TimeSpan compareTime = dt - Convert.ToDateTime(getTime());
    totalSeconds = (int)compareTime.TotalSeconds;  

    return totalSeconds;  //0
}

您不能简单地等待正常函数中协程的结果,除非您希望您的游戏冻结,直到您通过使用 while 循环等得到答案。

我可以建议您采用以下策略:使用回调。回调是当前 function/coroutine 完成工作时将调用的函数。在 requestNowTime 中收到 WWW 参数后,调用将计算经过时间的函数。在同一个函数中,当你完成计算时,使用一个回调函数,它是原始调用者的函数,它将能够首先按预期使用结果。

WWW www;

// Call this function to start the computing process
public void ProcessElapsedSeconds(Action functionToCallWhenDone)
{
    StartCoroutine(requestNowTime(functionToCallWhenDone));
}

public IEnumerator requestNowTime(Action callback)
{
    www = new WWW(url);

    OnTimeReceived(www, functionToCallWhenDone);
}  

void OnTimeReceived(WWW www, Action functionToCallWhenDone)
{
    int totalSeconds = 0;
    DateTime dt = Convert.ToDateTime(www.text);
    TimeSpan compareTime = dt - Convert.ToDateTime(getTime());
    totalSeconds = (int)compareTime.TotalSeconds;  

    functionToCallWhenDone(totalSeconds);
}