Unityにてhttp通信でテキストファイルを取得して変数に書き込みたいのですが、UnityWebRequestを使ってGETしてみると非同期処理になってしまうようで,ソースの一番下のDebug.Logで表示すると空のテキストが表示されてしまいます。
Sendの処理の完了を待つようにできないでしょうか?
ご教授よろしくお願いいたします。
c#
1using UnityEngine.Networking; 2 3void Start () { 4 ReadData(); 5} 6 7public string textdata = ""; 8 9public void ReadData(){ 10 StartCoroutine (GetProblem ()); 11 // ↓このdebug.logでtextdataが空になってしまう 12 Debug.Log ("finished: " + textdata); 13} 14 15public IEnumerator GetProblem(){ 16 UnityWebRequest www = UnityWebRequest.Get ("http://xxx.xxx.xxx.xxx/xxx.txt"); 17 yield return www.Send (); 18 19 if (www.isError) { 20 Debug.Log (www.error); 21 } else { 22 textdata = www.downloadHandler.text; 23 // ここでは表示される Debug.Log (textdata); 24 } 25} 26
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
全体の処理をコルーチンで記述するか、コールバックを設けるのが一般的でしょうか
・全体をコルーチンで
C#
1public string textdata = ""; 2 3IEnumerator Start () { 4 yield return GetProbrem(); 5 //通信後の処理をそのまま流れで書ける 6 Debug.Log ("finished: " + textdata); 7} 8 9public IEnumerator GetProblem(){ 10 UnityWebRequest www = UnityWebRequest.Get ("http://xxx.xxx.xxx.xxx/xxx.txt"); 11 yield return www.Send (); 12 13 if (www.isError) { 14 Debug.Log (www.error); 15 } else { 16 textdata = www.downloadHandler.text; 17 // ここでは表示される Debug.Log (textdata); 18 } 19}
・コールバックで書く
C#
1 2void Start () { 3 ReadData(); 4} 5 6public void ReadData(){ 7 StartCoroutine (GetProblem (txt => { 8 //通信結果をコールバックとして受け取る 9 Debug.Log ("finished: " + txt); 10 })); 11} 12 13public IEnumerator GetProblem(System.Action<string> callback){ 14 UnityWebRequest www = UnityWebRequest.Get ("http://xxx.xxx.xxx.xxx/xxx.txt"); 15 yield return www.Send (); 16 17 if (www.isError) { 18 Debug.Log (www.error); 19 } else { 20 callback.Invoke(www.downloadHandler.text); 21 } 22} 23 24
個人的にはコールバックを多用するとネストが深くなって読みにくくなるので、コルーチンでやるのが好きですね
投稿2017/08/07 03:30
編集2017/08/07 03:31総合スコア134
0
提示されたソースだと実行できません。
・yield return www.Send ();
はIEnumerator
内でしか動作しません。
・}
が1つ多いです。
なので、推測ですが、
C#
1 string textdata = ""; 2 3 UnityWebRequest www = UnityWebRequest.Get ("http://xxx.xxx.xxx.xxx/xxx.txt"); 4 yield return www.Send (); 5 6 if (www.isError) { 7 Debug.Log (www.error); 8 } else { 9 textdata = www.downloadHandler.text; 10 }
以上の処理は、IEnumerator
内に書かれていると思います。
これは、コルーチンというもので、通常の関数とは異なります。
この場合、yield return www.Send ();
では、送信処理を行うだけではなく、受信するまで待機する、ということも行われます。
そのため、受信し終わってから、if (www.isError) {
以下の処理が行われます。
受信するまでは、Unity上ではUpdate()
などの他の処理が行われます。
なので、textdata
に何か文字列が入ってからDebug.Log(textdata);
を実行するというような処理にする必要があります。
投稿2017/08/07 01:56
総合スコア9797
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/07 02:53
0
ベストアンサー
通信が終了したかを isDone で判断して(isDoneがtrueになるまでは yield return で待つようなループにして)から終了後のデータ参照(やエラー判定)をしてはどうでしょうか?
UnityWebRequest.isDone
(具体的事例を追記)
c#
1yield return www.Send(); 2 3```と 4```c# 5if (www.isError) { 6 7```の間に 8```c# 9while (!www.isDone) { 10 yield return null; 11} 12 13```を入れる
投稿2017/08/07 02:41
編集2017/08/07 04:39総合スコア2160
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/07 09:08
2017/08/07 11:25
2017/08/09 00:55
2017/08/10 00:14
2017/08/10 01:56 編集
2017/08/10 06:56
2017/08/10 09:34
2017/08/11 00:49
2017/08/11 01:17
2017/08/11 01:58
2017/08/11 06:56
2017/08/14 01:15
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/09 06:15
2017/08/10 00:08
2017/08/10 01:50
2017/08/15 03:37