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

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

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

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

Unity

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

Q&A

解決済

1回答

7904閲覧

Unity 動的に生成したボタンに、それぞれ異なるボタン処理を行いたい

Hutax

総合スコア32

C#

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

Unity

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

0グッド

1クリップ

投稿2016/09/12 08:36

###前提・実現したいこと
UnityのuGUIのボタンに関する質問なのですが、C#によって動的にボタンを作成するスクリプトを作成しました。(BtnMng.cs)
このスクリプトでは、MySQLに保存しているデータを引っ張ってきて、生成するボタンにTextとして貼り付けています。
実現したいことは、動的に生成したボタンにそれぞれ異なるボタン処理を行いたいです。

###発生している問題・エラーメッセージ

動的に生成されたボタンにそれぞれ異なるクリックイベントをつけたいのですが、どのようなコードを追加すればよいのかわからず行き詰ってしまいました。

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

using UnityEngine; using System.Collections; using MiniJSON; using UnityEngine.UI; public class BtnMng : MonoBehaviour { [SerializeField] RectTransform prefab = null; void Start() { StartCoroutine("GetJSON"); } IEnumerator GetJSON() { // webサーバへアクセス WWW www = new WWW("http://localhost/~~~.php"); // webサーバから何らかの返答があるまで停止 yield return www; // もし、何らかのエラーがあったら if (!string.IsNullOrEmpty(www.error)) { // エラー内容を表示 Debug.LogError(string.Format("Fail Whale!\n{0}", www.error)); yield break; // コルーチンを終了 } // webサーバからの内容を文字列変数に格納 string json = www.text; // JSONデータは最初は配列から始まるので、Deserialize(デコード)した直後にリストへキャスト IList List = (IList)Json.Deserialize(json); // リストの内容はオブジェクトなので、辞書型の変数に一つ一つ代入しながら、処理 foreach (IDictionary list in List) { string number = (string)list["num"]; var item = GameObject.Instantiate(prefab) as RectTransform; item.SetParent(transform, false); var text = item.GetComponentInChildren<Text>(); text.text = number.ToString() + "番"; } } }

###試したこと
多くのサイトを参考にして
BtnMng.csの text.text = number.ToString() + "番"; の後に

Button

1 button.onClick.AddListener(() => 2 { 3 print("aaa"); 4 });

を記載すると、すべてのボタンで、クリックするとaaaという文字がログに表示されるようになりましたが、それぞれのボタンで異なる処理をするには未だ至っておりません。

まだUnityを始めたばかりのため、至らない点多くあり、説明が不足している点があるかと思いますが、何卒ご協力お願いできないでしょうか。よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

UnityのSendMessageはご存知ですか?
SendMessage
この機能は文字列を渡すと、その関数を実行してくれるという便利な機能です。(普通に呼び出すより幾分遅い処理ですが)
例えば、print("aaa")のところをSendMessage("aaa")に書き換えると、
void aaa() という関数を実行します(もちろん、作ってない場合はエラーになります)

この機能を利用すれば、渡す文字列を変えるだけで処理を分ける事が可能です。
Unity SendMessageでググればもっと実用的な使い方を説明しているサイトも山程出てきますのでお試しください。

投稿2016/09/12 08:55

ishi9

総合スコア1294

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

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

ishi9

2016/09/12 09:02

追記(始めたばかりということなので、念のため) string number = "Function001"; button.onClick.AddListener(() => { print(number); }); のようにAddListenerの上で定義している変数は特に何もしなくても AddListenerの中でも普通に使えます。
Hutax

2016/09/12 11:43

ishi9様 ご回答ありがとうございます。 教えていただきましたSendMessageを調べてみました。 それを基に色々試しましたが、私の知識、理解が不十分であるため、 分かりやすく教えていただいたにも関わらず、うまくいきませんでした。 そこで以下のように、値を指定し、一致した時だけイベント処理をするという感じにしました。(これだとたくさんのif文が必要になってしまいますが…) string num1 = number.ToString(); Button button = item.GetComponent<Button>(); if (num1 == "1") { button.onClick.AddListener(() => { print("aaaaaa"); }); } よろしければ、SendMessageを用いた場合は どのようなコードとなるのかご教授お願いできないでしょうか。 お手を煩わすようなこととなってしまい大変申し訳ございません。
ishi9

2016/09/13 02:01 編集

すいません、今回のケースであればSendMessageは無理に使う必要は無さそうです。 (無理に使うとかえって処理が複雑になります) ひとまず大量のif文が気になるということであればswitch文を検討してみてはいかがでしょうか? string num1 = number.ToString(); Button button = item.GetComponent<Button>(); switch (num1) {   // ここから   case "1":   {     button.onClick.AddListener(() =>     {       print("aaaaaa");     });   }   break;   // ここまでが1セット      // 上記の1セットをコピペして num が "2"だった場合の処理を追加   case "2":   {     button.onClick.AddListener(() =>     {       print("bbbbbb");     });   }   break;   // ここまでがnum が ”2" だった場合の処理 } // switch文はここまで
Hutax

2016/09/13 02:20

ishi9様 コメントありがとうございます。 今回の場合はSendMessageは利用しない方が良いということですが、 新たな知識としてSendMessageの使い方を学ぶことができたため、教えていただき感謝しております。 丁寧に教えていただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問