代码之家  ›  专栏  ›  技术社区  ›  DongHyun KIM

如何在Unity3d协程中获取返回值(int)?[副本]

  •  1
  • DongHyun KIM  · 技术社区  · 9 年前

    如何在协同程序中获得返回值? 但是,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
    }
    
    1 回复  |  直到 9 年前
        1
  •  1
  •   Izuka Apurv pawar    9 年前

    你不能简单地在一个普通函数中等待协程的结果,除非你想通过使用while循环或类似的方法将游戏冻结,直到你的答案在那里。

    我可以建议您采用以下策略:使用回调。回调是在当前函数/协同例程完成工作时将调用的函数。在您收到 WWW requestNowTime

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