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

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

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

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

解決済

Unity 動的に作成されたボタン上のテキストをタイマー処理で表示変更

Hutax
Hutax

総合スコア32

C#

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

1回答

0リアクション

0クリップ

3428閲覧

投稿2016/10/09 12:39

###前提・実現したいこと
Unityを用いながら、プログラミングの勉強をしています。
その中で、今回もタイマー処理に関して行き詰ってしまったため、質問させていただきました。

今回実現したいことは、動的に作成されたボタンの子オブジェクトのテキストをタイマーで0になったときに表示を変えることです。

概要としましては、DBからphpで値を取得し、JSON形式でUnity側に送り、C#で表示しています。このとき、取得したJSONを表示するのに、プレハブ化したボタンを用意し、動的に表示するようなプログラムを作りました。
ここにタイマー処理を加え、ボタンの子オブジェクトのテキストの表示を変更するプログラムを考えているのですがうまくいきません。

ボタンプレハブには、子オブジェクトとしてテキストが3つ付いており、
・○の数を表示するテキスト
・×の数を表示するテキスト
・アルファベットを表示するテキスト
となっています。

##発生している問題
行き詰った内容としましては、作成したC# timer.csでは、JSONをしっかり解析し、動的にボタン上に表示されるのですが、
ここにタイマー処理を加えると、表示したいボタンとは別に新たにボタンが作成され、そのボタンのみタイマー処理で表示が切り替わってしまいます。

###該当のソースコード
timer.cs

C#

using UnityEngine; using System.Collections; using MiniJSON; using UnityEngine.UI; using UnityEngine.SceneManagement; public class timer : MonoBehaviour { [SerializeField] RectTransform prefab = null; Text text; public float Timer = 10; void Start() { StartCoroutine(Connect()); var item = GameObject.Instantiate(prefab) as RectTransform; item.SetParent(transform, false); text = item.Find("text").GetComponentInChildren<Text>(); } 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";//改行コード 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<Text>(); var batu = item.Find("batu").GetComponentInChildren<Text>(); var text = item.Find("text").GetComponentInChildren<Text>(); maru.text = "○ =" + maru.ToString() + "個"; batu.text = "× =" + batu.ToString() + "個"; text.text = "A"; } } // Update is called once per frame void Update() { Timer -= Time.deltaTime; // マイナス値にならないようにしている Timer = Mathf.Max(Timer, 0); if (Timer == 0) { text.text = "B"; Timer =10; } } }

###試したこと
timer.csの、void Update()より上の部分だけですと、○と×の数、アルファベットを表示したボタンが動的に作成されます。
ここでアルファベットの値を、10秒経過したらAからBに変えたいと考え、void Update()を書き加えたところ、ボタン上のアルファベットは何も変化せず、
新たにボタンが作成され、そのボタンのアルファベットがBとなってしまいます。

考えたこととしましては、foreach文の外でvoid Update()をおこなっているため、また別にボタンが作成され、そのボタンでのみ表示が変わってしまうのかなと考えています。
そのため、foreach文内でvoid Update()をくわえたところ、エラーが出てしまい、動きませんでした。

動的に作成されたボタン上の子オブジェクトのテキストを時間が来たら変更するには、どのようなプログラムを書けばよろしいのでしょうか。

プログラミングの勉強を始めたばかりなので、まだまだ未熟なところも多く、拙い文章で、分りにくい所も多々あると思いますが、何卒お力をお借りできませんでしょうか。
よろしくお願い致します。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。