2017-09-08 11 views
1

コルーチンの戻り値を取得する方法は? しかし、getElapseSecond()関数はコルーチン内にあってはなりません。Unity3dコルーチンで戻り値(int)を取得するにはどうすればよいですか?

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 
} 
+0

'getElapseSecond'をコルーチン関数にして、その二重引用符に示すように' Action'を使います。また、void関数として保持することもできますが、Isukaの答えに記述されているようにコールバック関数を使用します。 – Programmer

答えて

1

あなたは、単にあなたの答えは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); 
} 
関連する問題