質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

644閲覧

unity c# コルーチン

sashiburi

総合スコア20

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/10/21 07:56

現在unityで開発をしています。コルーチンを使用してphpと通信を行う処理を実装しているのですが下記のようにデータベースに値を送って返ってきた値をコンソールに表示するという処理を行いたいのですが変数に返り値が代入されるより先にコンソールに表示されてしまいます。

どこを変えればよいでしょうか?

c#

1コード 2 3using System.Collections; 4using System.Collections.Generic; 5using UnityEngine; 6 7public class Sample : MonoBehaviour 8{ 9 public static Dictionary<string, string> dic = new Dictionary<string, string>(); 10 public static string ServerAddress = "http://localhost/sample/sample.php"; //selecttest.phpを指定 今回のアドレスはlocalhost 11 12 // Start is called before the first frame update 13 void Start() 14 { 15 var obj = gameObject.AddComponent<DbProcess>(); 16 17 dic.Add("name", top.name); 18 19 obj.DbConnect(ServerAddress, dic); 20 Debug.Log(DbProcess.returnText); 21 } 22 23 24} 25

c#

1コード 2 3using System.Collections; 4using System.Collections.Generic; 5using System.Text; 6using UnityEngine; 7using UnityEngine.SceneManagement; 8using UnityEngine.UI; 9 10public class DbProcess : MonoBehaviour 11{ 12 public static string returnText = ""; 13 14 public void DbConnect(string ServerAddress, Dictionary<string, string> dic) 15 { 16 StartCoroutine(Access(ServerAddress, dic)); 17 } 18 19 private IEnumerator Access(string ServerAddress, Dictionary<string, string> dic) 20 { 21 StartCoroutine(Post(ServerAddress, dic)); 22 23 yield return 0; 24 } 25 26 private IEnumerator Post(string url, Dictionary<string, string> post) 27 { 28 WWWForm form = new WWWForm(); 29 foreach (KeyValuePair<string, string> post_arg in post) 30 { 31 form.AddField(post_arg.Key, post_arg.Value); 32 } 33 WWW www = new WWW(url, form); 34 35 yield return StartCoroutine(CheckTimeOut(www, 3f)); 36 37 if (www.error != null) 38 { 39 UnityEngine.Debug.Log("つながりません"); 40 //そもそも接続ができていないとき 41 } 42 else if (www.isDone) 43 { 44 returnText = www.text; 45 } 46 47 48 } 49 50 51 private IEnumerator CheckTimeOut(WWW www, float timeout) 52 { 53 float requestTime = Time.time; 54 55 while (!www.isDone) 56 { 57 if (Time.time - requestTime < timeout) 58 yield return null; 59 else 60 { 61 UnityEngine.Debug.Log("TimeOut"); //タイムアウト 62 //タイムアウト処理 63 // 64 // 65 break; 66 } 67 } 68 69 yield return null; 70 } 71 72} 73

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

StartCoroutine()で実行されたコルーチンはyield文で中断され、その続きの処理に移ります。
obj.DbConnect(ServerAddress, dic);内でコルーチンを実行してもそれは同じで、yield文で中断された後にDebug.Log(DbProcess.returnText);が実行されます。
関数で囲んだからといって、コルーチンの全ての処理が完了するまで待ち合わせてくれるわけではないのです。

今回の場合、SampleのStart()自体をコルーチンにして、処理が完了するまで待機させるようにするのがいいと思います。

投稿2020/10/21 08:50

fiveHundred

総合スコア9803

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sashiburi

2020/10/21 09:44

ご回答ありがとうございます。 SampleのStart()自体をコルーチンにするというのは中身をコルーチンにするのでしょうか?
fiveHundred

2020/10/21 09:55

中身をコルーチンにしてもいいですが、「IEnumerator Start()」とすることでStart()自体をコルーチンとすることもできます。
sashiburi

2020/10/21 12:05

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問