質問: "B"; Timer =10; } } } ``` ### 試したこと timer.csの、void Update()より上の部分だけですと、○と×の数、アルファベットを表示したボタンが動的に作成されます。 ここでアルファベットの値を、10秒経過したらAからBに変えたいと考え、void Update()を書き加えたところ、ボタン上のアルファベットは何も変化せず、 新たにボタンが作成され、そのボタンのアルファベットがBとなってしまいます。 考えたこととしましては、foreach文の外でvoid Update()をおこなっているため、また別にボタンが作成され、そのボタンでのみ表示が変わってしまうのかなと考えています。 そのため、foreach文内でvoid Update()をくわえたところ、エラーが出てしまい、動きませんでした。 動的に作成されたボタン上の子オブジェクトのテキストを時間が来たら変更するには、どのようなプログラムを書けばよろしいのでしょうか。 プログラミングの勉強を始めたばかりなので、まだまだ未熟なところも多く、拙い文章で、分りにくい所も多々あると思いますが、何卒お力をお借りできませんでしょうか。 よろしくお願い致します。
回答: Connect内の以下の部分を修正してみてください。 ``` var text = item.Find("text").GetComponentInChildren(); //↓修正 text = item.Find("text").GetComponentInChildren(); ``` 「var」=新たに変数を定義しています。 つまり...... ・「メソッド内で宣言したtext」と「クラスで宣言したtext」は別物である。 ・今のコードだと「メソッド内で宣言したtext」に目的のTextコンポーネントが入っている。 なのにUpdateで書き換えようとしているのは「クラスで宣言したtext」→目的のTextが書き換わらない! ・「クラスで宣言したtext」に目的のTextコンポーネントが入るよう修正する。 ちなみに現状だと、クラスで宣言したtext変数にはStartでInstantiateされたオブジェクトのテキストが入っています。 修正後は「foreachで最後に作ったitemのTextコンポーネント」が入ります。 ■複数のTextを扱う場合(コメント返答) 何がわからないのかわからないですが(配列の使い方は参考サイトに書いてある通りなので)...... 「配列という概念自体がよくわからない」ということなら、「変数 配列」とかでググって頂ければ幸いです。 一応私が作るならこんな感じかな?というコードを載せます。変更箇所には「変更」とコメントを付けています。 ``` using UnityEngine; using System.Collections; using MiniJSON; using UnityEngine.UI; using UnityEngine.SceneManagement; public class timer : MonoBehaviour { [SerializeField] RectTransform prefab = null; Text[] text; //変更:要素数固定なのでtype[]型にしました public float Timer = 10; void Start() { StartCoroutine(Connect()); /* 変更(不要なのでコメントアウト) var item = GameObject.Instantiate(prefab) as RectTransform; item.SetParent(transform, false); text = item.Find("text").GetComponentInChildren(); */ } IEnumerator Connect() { // webサーバへアクセス WWW www = new WWW("http://~~~.php"); // webサーバから何らかの返答があるまで停止 yield return www; Debug.Log(www.text); //phpからJSONが送られてきているかどうかの確認 // もし、何らかのエラーがあったら if (!string.IsNullOrEmpty(www.error)) { // エラー内容を表示 Debug.LogError(string.Format("Fail Whale!\n{0}", www.error)); yield break; // コルーチンを終了 } string json = www.text; IList List = (IList)Json.Deserialize(json); string s; s = "\r\n";//改行コード text = new Text[List.count]; //変更(追記):Textリストを初期化する int id = 0; //変更(追記):配列に収める為のIDを用意する foreach (IDictionary list in List) { string maru = (string)list["maru"]; string batu = (string)list["batu"]; var item = GameObject.Instantiate(prefab) as RectTransform; item.SetParent(transform, false); var maru = item.Find("maru").GetComponentInChildren(); var batu = item.Find("batu").GetComponentInChildren(); text[id] = item.Find("text").GetComponentInChildren(); //変更:配列にTextコンポーネントを入れる maru.text = "○ =" + maru.ToString() + "個"; batu.text = "× =" + batu.ToString() + "個"; text[id].text = "A"; //変更:文章を指定する id++; //変更(追記):配列に収める為のIDを用意する } } // Update is called once per frame void Update() { Timer -= Time.deltaTime; // マイナス値にならないようにしている Timer = Mathf.Max(Timer, 0); if (Timer == 0) { text[0].text = "B"; //変更:配列0番に入っているTextコンポーネントの中身書き換え text[1].text = "C"; //変更:配列1番に入っているTextコンポーネントの中身書き換え(使用例) Timer =10; } } } ``` 正直配列を覚えないとJSONを使ったシステムの作成は非常に困難だと思います。 (というかJSONをデシリアライズしたListが既に配列なんですけどね......) これを機に覚えると今後の開発が楽になるかと思います。