###前提・実現したいこと
Unityを用いながら、プログラミングの勉強をしています。
その中で、今回もタイマー処理に関して行き詰ってしまったため、質問させていただきました。
今回実現したいことは、動的に作成されたボタンの子オブジェクトのテキストをタイマーで0になったときに表示を変えることです。
概要としましては、DBからphpで値を取得し、JSON形式でUnity側に送り、C#で表示しています。このとき、取得したJSONを表示するのに、プレハブ化したボタンを用意し、動的に表示するようなプログラムを作りました。
ここにタイマー処理を加え、ボタンの子オブジェクトのテキストの表示を変更するプログラムを考えているのですがうまくいきません。
ボタンプレハブには、子オブジェクトとしてテキストが3つ付いており、
・○の数を表示するテキスト
・×の数を表示するテキスト
・アルファベットを表示するテキスト
となっています。
##発生している問題
行き詰った内容としましては、作成したC# timer.csでは、JSONをしっかり解析し、動的にボタン上に表示されるのですが、
ここにタイマー処理を加えると、表示したいボタンとは別に新たにボタンが作成され、そのボタンのみタイマー処理で表示が切り替わってしまいます。
###該当のソースコード
timer.cs
C#
1using UnityEngine; 2using System.Collections; 3using MiniJSON; 4using UnityEngine.UI; 5using UnityEngine.SceneManagement; 6 7public class timer : MonoBehaviour 8{ 9 10 [SerializeField] 11 RectTransform prefab = null; 12 13 Text text; 14 public float Timer = 10; 15 16 void Start() 17 { 18 StartCoroutine(Connect()); 19 20 var item = GameObject.Instantiate(prefab) as RectTransform; 21 item.SetParent(transform, false); 22 text = item.Find("text").GetComponentInChildren<Text>(); 23 } 24 25 IEnumerator Connect() 26 { 27 // webサーバへアクセス 28 WWW www = new WWW("http://~~~.php"); 29 // webサーバから何らかの返答があるまで停止 30 yield return www; 31 Debug.Log(www.text); //phpからJSONが送られてきているかどうかの確認 32 33 // もし、何らかのエラーがあったら 34 if (!string.IsNullOrEmpty(www.error)) 35 { 36 // エラー内容を表示 37 Debug.LogError(string.Format("Fail Whale!\n{0}", www.error)); 38 yield break; // コルーチンを終了 39 } 40 41 string json = www.text; 42 43 IList List = (IList)Json.Deserialize(json); 44 45 string s; 46 s = "\r\n";//改行コード 47 48 foreach (IDictionary list in List) 49 { 50 string maru = (string)list["maru"]; 51 string batu = (string)list["batu"]; 52 53 var item = GameObject.Instantiate(prefab) as RectTransform; 54 item.SetParent(transform, false); 55 var maru = item.Find("maru").GetComponentInChildren<Text>(); 56 var batu = item.Find("batu").GetComponentInChildren<Text>(); 57 var text = item.Find("text").GetComponentInChildren<Text>(); 58 59 maru.text = "○ =" + maru.ToString() + "個"; 60 batu.text = "× =" + batu.ToString() + "個"; 61 62 text.text = "A"; 63 64 } 65 66 } 67 68 69 // Update is called once per frame 70 void Update() 71 { 72 Timer -= Time.deltaTime; 73 // マイナス値にならないようにしている 74 Timer = Mathf.Max(Timer, 0); 75 if (Timer == 0) 76 { 77 text.text = "B"; 78 Timer =10; 79 } 80 81 } 82}
###試したこと
timer.csの、void Update()より上の部分だけですと、○と×の数、アルファベットを表示したボタンが動的に作成されます。
ここでアルファベットの値を、10秒経過したらAからBに変えたいと考え、void Update()を書き加えたところ、ボタン上のアルファベットは何も変化せず、
新たにボタンが作成され、そのボタンのアルファベットがBとなってしまいます。
考えたこととしましては、foreach文の外でvoid Update()をおこなっているため、また別にボタンが作成され、そのボタンでのみ表示が変わってしまうのかなと考えています。
そのため、foreach文内でvoid Update()をくわえたところ、エラーが出てしまい、動きませんでした。
動的に作成されたボタン上の子オブジェクトのテキストを時間が来たら変更するには、どのようなプログラムを書けばよろしいのでしょうか。
プログラミングの勉強を始めたばかりなので、まだまだ未熟なところも多く、拙い文章で、分りにくい所も多々あると思いますが、何卒お力をお借りできませんでしょうか。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/10 09:51 編集
2016/10/10 09:47
2016/10/10 10:31
2016/10/10 12:26