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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

2回答

3772閲覧

Unity)ボタンで取得したテキストを取得したい

navesanta

総合スコア198

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2018/11/04 09:33

編集2018/11/05 06:56

まずCSVデータをUTF-8で作成してアプリに設置しました。
wordCsv.csv

A,説明A B,説明B C,説明C C,説明D E,説明E F,説明F G,説明G H,説明H

次にこのCSVデータを取得するスクリプトを作成。

CsvReader.cs

public class CsvReader : MonoBehaviour { public static List<string[]> csvDatas = new List<string[]>(); // Use this for initialization void Start () { CsvRead("Csv/wordcsv"); } //CSVからDataを取得する public void CsvRead(string csvName){ TextAsset csv = Resources.Load(csvName) as TextAsset; StringReader reader = new StringReader(csv.text); while(reader.Peek() > -1){ string line = reader.ReadLine(); csvDatas.Add(line.Split(',')); } } }

次に取得したCSVデータの1列目をボタンに表示するためのスクリプトを作成してボタンXのOnclick属性に設置。
(実際はボタンXは複数ありwordFlagで区分けしています)

OnClickScript.cs

public class OnClickScript : MonoBehaviour { public static int wordFlag; public Text wordButton1; public Text wordButton2; public Text wordButton3; public Text wordButton4; public Text wordButton5; public void OnclickButton(int wordNum){ wordFlag = wordNum; Debug.Log("wordFlag:" + wordFlag); cateButtons.SetActive(false); wordButtons.SetActive(true); switch(wordFlag) { case 0: wordButton1.text = CsvReader.csvDatas[0][0]; wordButton2.text = CsvReader.csvDatas[1][0]; wordButton3.text = CsvReader.csvDatas[2][0]; wordButton4.text = CsvReader.csvDatas[3][0]; break; case 1: wordButton1.text = CsvReader.csvDatas[12][0]; wordButton2.text = CsvReader.csvDatas[13][0]; wordButton3.text = CsvReader.csvDatas[14][0]; wordButton4.text = CsvReader.csvDatas[15][0]; ....... break; default: break; }

ボタンXをクリックしたらボタンA~Hが表示されました。(ここまではOK)
やりたいこと

この生成されたA~Hボタンの押した時にこの表示されている文字(AボタンならA)をDebug.Logで表示したいです。

OnClickScript3.cs

public class OnClickScript3 : MonoBehaviour { private Text confirData2; public void OnclickButton(int wordNum){ switch(wordNum){ case 0: confirData2 = this.GetComponentInChildren<Text>(); Debug.Log("confirData2:" + confirData2); break; } } }

上記のスクリプトを作成してA(E)にアタッチして
OnClick属性を設定して
実行してAボタンをクリックしました。
Debug.Logで表示されてほしい内容は「confirData2:A」なのですが
実際に表示される内容は「confirData2:Text(UnityEngine.UI.Text)」になってしまいます。
どうすれば希望通りになるのでしょうか?

環境)
PC: mac
Unity2018.2
言語:C#

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

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

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

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

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

MMashiro

2018/11/05 01:16

一般的な意味合いと異なる'属性' や 同じhogeだが違う複数の意味があったり など質問の意図が掴みづらいです。GetComponentじゃダメな理由、またインスペクタからHogeをセットするのがダメな理由を記述していただけると回答が得られやすいと思います。
navesanta

2018/11/05 02:02

実際の例に質問を変更しました。CSVデータをボタンテキストにする点がポイントです。よろしくお願いします。
MMashiro

2018/11/05 02:25

Aのボタンに何かスクリプトをアタッチしてGetComponent<Text>().text で取得するのではダメな理由は何でしょうか?
navesanta

2018/11/05 02:39

AとE、BとF、CとG、DとHは実際は同じButtonを使っているのが理由です。そうしないとButtonの数が実際は何百個になってしまうので・・・。
MMashiro

2018/11/05 04:14 編集

たとえ同じボタンだとしても GetComponent で表示されているテキストを取得できると思います。まだ情報に不足があるような気がします ボタンX側からボタンAのテキストを設定しているので、取得できないということはないと思うのでなぜ取得できないかを知りたいです
navesanta

2018/11/05 06:57

ご指摘通り情報が不足していました。追加しましたのでよろしくお願いします。
guest

回答2

0

ベストアンサー

GetComponent<T>()GetComponentInChildren<T>(); で取得したものはT型になります。
今回は GetComponentInChildren<Text>() なので帰ってくる値は Text型になります。

Text.text に表示されている文字が格納されている為、そちらのプロパティにアクセスしてみてください

csharp

1public class OnClickScript3 : MonoBehaviour { 2 3 4 private Text confirData2; 5 6 public void OnclickButton(int wordNum){ 7 switch(wordNum){ 8 case 0: 9 confirData2 = this.GetComponentInChildren<Text>(); 10 Debug.Log("confirData2:" + confirData2.text); //confirData2 だけだとTextオブジェクトのToString()の結果が帰ってきてしまいます 11 break; 12 } 13 } 14}

投稿2018/11/05 07:31

MMashiro

総合スコア2378

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

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

navesanta

2018/11/05 08:40

うまくいきました。ありがとうございました。指摘内容も理解しました。 これからもよろしくお願いします。
guest

0

例えば、ボタンBのクラスにHogeフィールドを用意して、インスペクタからそこにHogeを割り当ててあげればいいです。Hogeが動的に生成されているのであれば、ButtonA.OnClickButtonAの中で、ボタンBのHogeフィールドにセットしてあげる手もあります。

c#

1public class HogeGenerator : MonoBehaviour { 2 public void Generate() { 3 var hoge = ...hogeを生成する...; 4 var buttons = ...buttonを取得する(フィールドで持っててもよし)...; 5 // ボタンにhogeを登録する 6 foreach(var btn in buttons) 7 buttons.Target = hoge; 8 ...割愛... 9 10public class ButtonB : MonoBehaviour { 11 public Hoge Target; 12 publiv void OnClick() { 13 Target.text = this.GetComponent<Button>().titleText; 14 ...割愛

投稿2018/11/04 11:10

編集2018/11/05 04:42
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

navesanta

2018/11/04 20:41 編集

titleTextに入る値は流動的に変更になるものとして、インスペクタの割り当てやフィールドのセットのように固定的に取得するのではなく、タイムリーに今titleText.textに入っている値をButtonBをクリックした時に取得するメソッドが知りたいのです。イメージとしてはFindとGetComponentとかを使ってやるような感じだと当初思ったのですが 1)Findはリソースをたくさん使うのでできたら使いたくない。 2)GetComponentは属性内の値を取得するのではなく属性の領域を参照するためのもので値を取得するのは他にあるのでは? と思っています。他の方でも結構ですので分かる方見えましたらお願いします。
退会済みユーザー

退会済みユーザー

2018/11/05 04:37 編集

インスペクタで割り当ている以外の方法も書いてたのですが…。質問がだいぶ変わりましたねwwいいとおもいます。とはいえ、変更された質問であっても、titleTextが流動的だとしても、あらかじめインスペクタにセットできますし、コードからフィールドに固定することもなにも問題がありません。問題になるのは、hogeが動的に生成される場合です。その場合、hogeが生成されたタイミングで、ボタンのフィールドにそのhogeを割り当てるような処理を追加すればよいです。
退会済みユーザー

退会済みユーザー

2018/11/05 04:43

解答のコードをもう少し詳しく書いておきました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問