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

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

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

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

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

button

HTMLで用いる<button>タグです。

Q&A

解決済

1回答

1353閲覧

UnityのUIButtonにC#スクリプトをアタッチするとNullになる

tsukunemugi

総合スコア1

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

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

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

button

HTMLで用いる<button>タグです。

0グッド

0クリップ

投稿2021/11/16 08:12

編集2021/11/16 16:09

#UIButtonにスクリプトをアタッチするとNullになる

前提・実現したいこと 

UnityとC#にて、CSVを用いたシンプルなクイズアプリを制作しています。CSVの分解やGameScean上で表示するところまでは問題なく、Buttonも反応する(色が変わる)のですが、UI ButtonにスクリプトをアタッチするとNullの表示が出てしまい、Buttonも全く反応しなくなります。エラーの出る部分はクイズ問題や選択肢を表示させるために記述してあるGetComponentの部分です。

下記スクリプトの下の方にあるClickAnswerButton()がButtonにさせたい動作の内容です。どうすればエラーなくアタッチできるでしょうか?また、Buttonにアタッチしなければ何もエラーは起きないのに、GetcomponentにNullが出る理由はスクリプトの記述ミスなのでしょうか?

初めての質問で、ちゃんと伝わるよう説明できているか不安ですが、どなたかご回答いただけると幸いです。
よろしくお願いします。

##エラー内容
NullReferenceException: Object reference not set to an instance of an object
CSVScript.Start () (at Assets/CSVScript.cs:89)

##試したこと
Buttonに直接スクリプトをアタッチせずに、空のオブジェクトを作成し、C#スクリプトをアタッチ、そしてそれをOnClick()にアタッチしてみましたが、同じ結果になりました。また、Buttonの設定が間違っていないかチェックすべきことをいくつかのサイトから確認しましたが、問題ありませんでした。

##該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.SceneManagement; 6 7public class CSVScript : MonoBehaviour 8{ 9 public TextAsset CSV; 10 public Text value3, value4, value5; 11 public static int nowIndex = 1; 12 public static string CorrectAnswerText; 13 14 public Question[] questions = new Question[500]; 15 16 public static string QuestionText { get; private set; } 17 18 void Start() 19 { 20 string[] csv = CSV.text.Split('\n'); 21 Debug.Log(csv.Length); 22 23 for (int i = 1; i < csv.Length; i++) 24 { 25 string[] values = csv[i].Split(','); 26 27 string category = values[0]; 28 29 int level = 0; 30 if (values[1] == "初級") 31 { 32 level = 1; 33 } 34 else if (values[1] == "中級") 35 { 36 level = 2; 37 } 38 else if (values[1] == "上級") 39 { 40 level = 3; 41 } 42 43 string questionText = values[2]; 44 45 //values[3]A values[4]B values[5] 46 string[] answers = { values[3], values[4], values[5] }; 47 48 49 //正解の配列番号 Aが0、Bが1、Cが2 50 int answerIndex = 0; 51 if (values[6] == "A") 52 { 53 answerIndex = 0; 54 } 55 else if (values[6] == "B") 56 { 57 answerIndex = 1; 58 } 59 else 60 { 61 answerIndex = 2; 62 } 63 64 65 66 string comment = values[7]; 67 68 Question q = new Question(category, level, questionText, answers, answerIndex, comment); 69 70 questions[i] = q; 71 } 72 73 questions[nowIndex].ShowLog(); 74 75 76 GetComponent<Text>().text = questions[nowIndex].question; 77 value3.text = questions[nowIndex].answers[0]; 78 value4.text = questions[nowIndex].answers[1]; 79 value5.text = questions[nowIndex].answers[2]; 80 81 } 82 83 public void OnClickAnswerButton(int answerIndex) 84 { 85 CorrectAnswerText = questions[nowIndex].GetCorrectAnswerText(); 86 87 if (questions[nowIndex].answerIndex == answerIndex) 88 { 89 SceneManager.LoadScene("correct"); 90 } 91 else 92 { 93 SceneManager.LoadScene("incorrect"); 94 } 95 96 } 97 98 // Update is called once per frame 99 void Update() 100 { 101 102 } 103} 104

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

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

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

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

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

YAmaGNZ

2021/11/16 08:36

value3等は設定してあるのでしょうか? また、エラーの出ている行はどこでしょうか?
tsukunemugi

2021/11/16 09:36

設定というのはUnity内でということでしょうか? UnityのCanvasのInspecterの中に入れてあり、文字表示は問題なくできています。 しかし、ButtonのOn Click()を設定するためにこのスクリプトをアタッチすると GetComponent<Text>().text = questions[nowIndex].question; value3.text = questions[nowIndex].answers[0]; value4.text = questions[nowIndex].answers[1]; value5.text = questions[nowIndex].answers[2]; ここでエラーが出てしまいます。
tsukunemugi

2021/11/16 09:46

ヒエラルキーにあるA,B,Cがvalue1,2,3で、インスペクターの方に設定してあります。
tsuki01

2021/11/16 15:41

アタッチ先のオブジェクトにTextコンポーネントも付いてないとNullになりますが、UIButtonにTextコンポーネントがアタッチされている状態でお間違いないでしょうか? (通常UIButtonは、 ButtonとText でオブジェクトが分かれているので、Buttonの方にはTextコンポーネントは存在しないはず) また、添付されている画像は「Text」オブジェクトを選択した状態のインスペクターの様な気がしたのですが、画像の貼り間違いでしょうか。 (質問ではUIButtonにアタッチしたいとのことだったのに、画像ではTextにアタッチされている様に見えましたので)
tsukunemugi

2021/11/16 16:14

まだ学習を初めて間も無く質問が理解しきれずにいます…最初に記載した画像は、valueの設定に関する画像のつもりでいます… 質問内容であるUIButtonにアタッチに関してですが、”Buttonに直接アタッチし””空のオブジェクトを作成しスクリプトをアタッチ、そのオブジェクトをButtonのOn Click()にアタッチ”の2通りを試し、どちらも同じエラーがでてしまいます。 追加で載せた画像は後者です。
tsuki01

2021/11/16 16:32

画像が表示されなくなってしまっていますが、追加でコメントさせていただきます。 > GetComponent<Text>() 上記の部分ですが、 「オブジェクトからTextコンポーネントを取得する」という処理になります。 なので、Textコンポーネントもアタッチされているオブジェクトにしか「CSVScript」をアタッチできない状態になっています。 "空のオブジェクト”にはTextコンポーネントが存在しないので、Nullになりますよね(追加でアタッチしたなら別ですが) また、Buttonオブジェクトにも通常はTextコンポーネントが存在しないので、同様にNullになります。 説明下手で申し訳ないですが、以上で原因自体は伝わりますでしょうか。
tsukunemugi

2021/11/18 01:21

Nulliになる原因、理解できました。ありがとうございます。 Button用に別のスクリプトを作り、アタッチしてみます。
guest

回答1

0

自己解決

GetComponentではなく、GetComponentInChildにすることで解決できました。
回答してくださったお二方、ありがとうございました。

投稿2021/11/18 07:36

tsukunemugi

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問