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

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

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

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

Q&A

解決済

1回答

569閲覧

Nullがどうしても消えない

akkkh___

総合スコア3

C#

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

0グッド

0クリップ

投稿2022/09/29 07:26

完全独学でUnityを始めたのですが、こちらのプログラムで必ずNullReferenceExceptionというエラーが出てしまいます。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;//UI オブジェクトを扱う時は必須
public class QuizMgr : MonoBehaviour
{

   //アタッチしたオブジェクトが呼ばれた時に実行される。
void Start()
{
QuestionLabelSet();
AnswerLabelSet();
}

   private void QuestionLabelSet()
{
//特定の名前のオブジェクトを検索してアクセス
Text qLabel = GameObject.Find("Quiz/QLabel").GetComponentInChildren<Text>();
//データをセットすることで、既存情報を上書きできる
qLabel.text = "ランサーズ君は何歳?";
}
}

出来る限りの事はしたのですがどうしても解決出来ないので質問させていただきます。
参考にしたサイトはこちらです
https://engineer.blog.lancers.jp/ios/ugui_quiz_unity/

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

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

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

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

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

Sobasenbei

2022/09/29 07:38

GetComponentInChildrenでなく普通にgetcomponentをしても変わりませんか
akkkh___

2022/09/29 09:19

やってみましたがやはりエラーでした。
Sobasenbei

2022/09/29 11:23

エラーメッセージ全部載せてもらうことはできますか
akkkh___

2022/09/30 10:30

NullReferenceException: Object reference not set to an instance of an object QuizMgr.QuestionLabelSet () (at Assets/battle/QuizMgr.cs:16) QuizMgr.Start () (at Assets/battle/QuizMgr.cs:10) というエラーです。
Sobasenbei

2022/09/30 11:32

とりあえずQLabelのオブジェクト自体の参照ができるか確認できますか Gameobject qlabel=Gameobject.find(quiz/qlabel) これでエラーが出たらQLabel自体が見つからない、出なければオブジェクトは見つかったけどコンポーネントが見つからないといったことが分かります。 ちなみにパソコン自体の性能が低かったり、Unityが起動しっぱなしだったりするとよく分からな所でエラーを吐いたりするので再起動とかもしてみてください
guest

回答1

0

ベストアンサー

コードを以下のように書き換えて見てください

cs

1 //Text qLabel = GameObject.Find("Quiz/QLabel").GetComponentInChildren<Text>(); 2 GameObject obj = GameObject.Find("Quiz/QLabel"); 3 Debug.Log(obj); 4 Text text = obj.GetComponent<Text>(); 5 Debug.Log(text); 6

objがnullなら、おそらくオブジェクト名か、オブジェクト構成(QLabelがQuizの子でないなど)が間違っている。
textがnullなら、おそらくQLabelがUI>Textオブジェクトではない。

【コメントを受けて追記】
失礼しました。言葉が足りなかったです。
Start()関数とQuestionLabelSet()の中身を以下のように書き換えてください。

cs

1 void Start() { 2 QuestionLabelSet(); 3 // AnswerLabelSet(); 4 } 5 6 private void QuestionLabelSet() { 7 // QLabel を取得 8 GameObject obj = GameObject.Find("Quiz/QLabel"); 9 Debug.Log(obj); 10 // QLabel 内のTextコンポーネントを取得 11 Text qLabel = obj.GetComponent<Text>(); // GetComponentInChildrenでないことに注意 12 Debug.Log(qLabel); 13 // テキストの内容を変更 14 qLabel.text = "ランサーズ君は何歳?"; 15 }

投稿2022/09/29 13:50

編集2022/09/30 11:24
pm_tera

総合スコア133

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

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

akkkh___

2022/09/30 10:33

書き換えてみると Assets\QuizMgr.cs(13,18): error CS0111: Type 'QuizMgr' already defines a member called 'QuestionLabelSet' with the same parameter types Assets\QuizMgr.cs(8,10): error CS0111: Type 'QuizMgr' already defines a member called 'Start' with the same parameter types Assets\QuizMgr.cs(4,14): error CS0101: The namespace '<global namespace>' already contains a definition for 'QuizMgr' の3つがエラーで出てきました。調べてみると同じ定義があるとの事ですが、QuizMgrというのはひとつしかありません。知識不足ですみません。
pm_tera

2022/09/30 11:29

コードの詳細を追記しました。 >エラーについて テスト用とかでQuizMgrスクリプトファイルを複数作っていませんか?
akkkh___

2022/10/12 09:13

返信遅くなりすみません。 テスト用ではなかったのですが、もう1つのプログラムの方に間違えて打ち込んでいました。 それを消してもう一度試してみるとAssets\QuizMgr.cs(7,1): error CS0106: The modifier 'private' is not valid for this item というエラーが出ました。 調べてもよく分からなかったです。お手数お掛けしてすみません。
pm_tera

2022/10/12 09:48

現状のQuizMgr.csの内容をもう一度見せてもらえます?
akkkh___

2022/10/12 23:26

追記していただいたコードをそのまま写しています。
pm_tera

2022/10/13 04:57

それだと該当のエラーは出ないと思ったのですが、どうやら私が理解できない理由でエラーが出ているようです。 お力になれず申し訳ありませんでした。
akkkh___

2022/10/13 07:06

申し訳ないのですが最初の using UnityEngine;
using System.Collections;
using UnityEngine.UI;//UI オブジェクトを扱う時は必須
public class QuizMgr : MonoBehaviour を入力していませんでした。 それを入力してもう一度試すと警告は出なくなったのですが Assets\GameStart.cs(10,13): warning CS0618: 'Application.loadedLevelName' is obsolete: 'Use SceneManager to determine what scenes have been loaded' Assets\GameStart.cs(12,13): warning CS0618: 'Application.LoadLevel(string)' is obsolete: 'Use SceneManager.LoadScene' の2つの注意(黄色い文字)が出てきました。 Quizmgrの他にGamestartというアセットを作っているのですが、そちらが何かおかしいのでしょうか。 Gamestartの内容は using UnityEngine; using System.Collections;   public class GameStart : MonoBehaviour {       public void  NextScene(){         //今いるシーンがTitleという名前であれば、Quizという名前のシーンに移動する         if (Application.loadedLevelName == "Title") {             Application.LoadLevel ("Quiz");         }     } } です。こちらのミスでご迷惑をおかけしてすみません。
pm_tera

2022/10/13 07:57

Application.~~という処理が、現在非推奨になっているとの警告です。 参考にしたサイトの記事が古すぎたのでしょう。 とりあえず警告を無視して実行はできますか?
akkkh___

2022/10/13 23:16

無視して実行するとテキストが変わるはずの場所が変わらないです。 確かに参照にしたサイトはかなり前のものです。このサイトを参考にして作るのは難しいのでしょうか?
pm_tera

2022/10/14 04:12

>無視して実行するとテキストが変わるはずの場所が変わらないです。 おそらく当初と同じNullReferenceExceptionが出てるはずです。 その前に2行Debug.Logが出ていて、 objがnullなら、おそらくオブジェクト名か、オブジェクト構成(QLabelがQuizの子でないなど)が間違っている。 qLabelがnullなら、おそらくQLabelがUI>Textオブジェクトではない。 というのが、当初の『Nullがどうしても消えない』の原因と思われます。 >このサイトを参考にして作るのは難しいのでしょうか? 正直、私はこのサイトをあまり信用できません。 おそらく記事を書いたのはプログラミング初心者です。 そして、記載されてるコードには今の警告以外にも致命的なバグがあります。 もし、あなたがまだUnity関連の書籍を読んだことがないのなら、まずは書籍から勉強することをオススメします。私も完全独学でしたが、そうやって始めました。 ネット記事はどうしてもバグが多いですし、書籍なら(Amazonで高評価なものは)ほぼバグがありません。 よく売れてる本なら図書館で借りられることもあるので、Unityと名の付く本を端から借りて、自分にあった本だけを読むというのもいいと思います。(Unity本高いですからね……)
akkkh___

2022/10/14 09:43

わかりました。今度図書館に行ってみようと思います。ご丁寧にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問