【问题标题】:How can i get return value(int) in Unity3d coroutine? [duplicate]如何在 Unity3d 协程中获取返回值(int)? [复制]
【发布时间】:2018-02-16 23:10:44
【问题描述】:

如何在协程中获取返回值? 但是,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
}

【问题讨论】:

  • 让你的getElapseSecond 也成为一个协程函数,然后使用Action,如复制中所示。您也可以将其保留为 void 函数,然后使用 Isuka 回答中所述的回调函数。

标签: c# unity3d return coroutine


【解决方案1】:

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

我可以建议您以下策略:使用回调。回调是您在当前函数/协程完成工作时将调用的函数。在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);
}

【讨论】:

    猜你喜欢
    • 2020-06-13
    • 2013-09-07
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 2017-06-07
    相关资源
    最近更新 更多