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

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

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

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

Unity

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

Q&A

解決済

1回答

825閲覧

unity c# コルーチン IEnumerator

sashiburi

総合スコア20

C#

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

Unity

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

0グッド

0クリップ

投稿2020/10/16 12:49

現在unityで開発をしています。

コルーチンを使用してphpと通信を行う処理を実装しているのですがそれぞれのクラスで実装するとうまくいくのですが下記のようにインスタンス化して使用するとエラーが起きます。

原因がわからず困っています。インスタンス化すると使えないのでしょうか?

c#

1 2コード 3 4get.cs 5 6using System.Collections; 7using System.Collections.Generic; 8using UnityEngine; 9 10public class get : MonoBehaviour 11{ 12 // Start is called before the first frame update 13 void Start() 14 { 15 var ins = new common(); 16 ins.getTalkCatalog(); 17 } 18 19 // Update is called once per frame 20 void Update() 21 { 22 23 } 24 25} 26

c#

1コード 2 3common.cs 4 5using System.Collections; 6using System.Collections.Generic; 7using UnityEngine; 8 9public class common : MonoBehaviour 10{ 11 private string SeverAddress = "http://localhost/sample.php"; 12 13 // Start is called before the first frame update 14 void Start() 15 { 16 17 } 18 19 // Update is called once per frame 20 void Update() 21 { 22 23 } 24 25 public void getTalkCatalog() 26 { 27 StartCoroutine("Sample");    ←ここでエラーが起きる 28 } 29 30 private IEnumerator Sample() 31 { 32 Dictionary<string, string> dic = new Dictionary<string, string>(); 33 34 StartCoroutine(Post(SeverAddress, dic)); 35 36 yield return 0; 37 } 38 39 private IEnumerator Post(string url, Dictionary<string, string> post) 40 { 41 WWWForm form = new WWWForm(); 42 43 foreach (KeyValuePair<string, string> post_arg in post) 44 { 45 form.AddField(post_arg.Key, post_arg.Value); 46 } 47 48 WWW www = new WWW(url, form); 49 50 yield return StartCoroutine(CheckTimeOut(www, 3f)); 51 52 if (www.error != null) 53 { 54 Debug.Log("つながらないよー"); 55 56 } 57 else if (www.isDone) 58 { 59 Debug.Log("つながったよー"); 60 61 Debug.Log(www.text); 62 63 } 64 } 65 66 private IEnumerator CheckTimeOut(WWW www, float timeout) 67 { 68 float requestTime = Time.time; 69 70 while (!www.isDone) 71 { 72 if (Time.time - requestTime < timeout) 73 { 74 yield return null; 75 } 76 else 77 { 78 Debug.Log("TimeOut"); 79 80 break; 81 } 82 } 83 84 yield return null; 85 } 86} 87

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

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

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

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

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

y_waiwai

2020/10/16 13:17

エラー出るならエラーメッセージを提示しましょう
sashiburi

2020/10/16 13:19

すみませんエラーではなくここで処理が止まりコルーチンの処理までたどりつきませんでした。
guest

回答1

0

ベストアンサー

C#

1 var ins = new common();

上記ですが、MonoBehaviourを継承したクラスはnewしてはいけません。
(というかその旨のwarningが出ていたと思いますが、ちゃんと読んだのでしょうか?)

gameObject.AddComponent<common>()でgetのゲームオブジェクトにcommonをアタッチするか、どこかのゲームオブジェクトにcommonをアタッチしてGetComponent<common>()FindObjectOfType<common>()で取得してください。
GameObjectのほうはnewできるので、併用すれば「空のゲームオブジェクトを作成し、それにcommonをアタッチする」ということも可能です。


あと、本題と逸れますが、以下気になった点があります。

  • この内容(おそらく参考にしているサイトの情報)は少し古いです。

今では、WWWクラスは非推奨ですし(代わりにUnityWebRequestを使えとのこと)、yield return StartCoroutine(CheckTimeOut(www, 3f));は単にyield return CheckTimeOut(www, 3f);としても動作するようになりました。

  • クラス名(≒スクリプト名)の先頭は大文字にするのが慣例です。
  • クラス名がgetだと「何を取得するのか」が分からないので、もっと分かりやすい名前にしたほうがいいでしょう。
  • これは個人的な意見ですが、StartCoroutine("Sample");よりもStartCoroutine(Sample());のほうが名称変更しやすいのでいいと思っています。

投稿2020/10/17 00:26

fiveHundred

総合スコア10152

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

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

sashiburi

2020/10/17 06:22

細かい点まで指摘していただきありがとうございます。 改善頑張ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問