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

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

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

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

Unity

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

Q&A

解決済

1回答

296閲覧

Unityの教科書におけるエラー(NullReferenceException: Object reference not set to an instance of an object)

MyAero

総合スコア1

C#

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

Unity

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

0グッド

0クリップ

投稿2025/04/26 13:05

編集2025/04/27 03:34

Unityの教科書2019版を読み進めています。
画面にUIテキストを表示させる演習があり、教科書通りにプログラムを作ったのですが、
以下のエラーが表示されます。
どなたかアドバイスをいただけませんでしょうか。

■プログラム

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class GameDirector : MonoBehaviour 7{ 8 GameObject car; 9 GameObject flag; 10 GameObject distance; 11 12 void Start() 13 { 14 this.car = GameObject.Find("car"); 15 this.flag = GameObject.Find("flag"); 16 this.distance = GameObject.Find("Distance"); 17 } 18 19 void Update() 20 { 21 float length = this.flag.transform.position.x - this.car.transform.position.x; 22 this.distance.GetComponent<Text>().text = "ゴールまで" + length.ToString("F2") + "m"; 23 } 24}

■エラー
NullReferenceException: Object reference not set to an instance of an object
GameDirector.Update () (at Assets/GameDirector.cs:22)

■画面キャプチャ
イメージ説明

4.27_12:33追記
■Distanceの中身
イメージ説明

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

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

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

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

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

fiveHundred

2025/04/27 00:08

まず、どこがnullになっているか、デバッガやDebug.Log()などで確認しましょう。 私が思うに、「this.distance」か「this.distance.GetComponent<Text>()」のどちらかがnullになっていそうな気がします。
MyAero

2025/04/27 01:30

ありがとうございます。 大変申し訳ないのですが、デバッグログの出力方法について教えていただけないでしょうか💦 void Startの中に以下のコードを入れてみたりはしたのですが、 Debug.LogやConsole.Writeなどがどこに出力されるのかも理解しておらず。。。基礎中の基礎過ぎるのか、ネット上にも情報がなく(応用知識はたくさん見つかりました)、難航しております。 if (this.distance == null) { Console.Write("Nullです"); } else { Console.Write("Nullではありません"); }
fiveHundred

2025/04/27 02:44

エラーと同じConsoleウィンドウに出力されるはずです。
fiveHundred

2025/04/27 02:48

あと、「Distance」オブジェクトの中身はどうなっていますか? そちらが原因な気がしてきました。
MyAero

2025/04/27 03:45

ありがとうございます。 質問にDistanceの設定に関する画面キャプチャを追加しました。 画像の通り、New Text という文字を入れています。 エラーについても、一画面に収まったのでついでにキャプチャをとったのですが、 画面の通り、Consoleの結果が出力されませんでした。 Nullであれば、Consoleウィンドウに「Nullです」と出るはず、という理解で間違いないでしょうか。
logres_Fan

2025/04/27 03:59

新刊が発売されているみたいですよ?
fiveHundred

2025/04/27 04:14

エラーで表示が流れてしまっているのではないでしょうか? (Collapseをクリックすれば、同じエラーをまとめることができます) とはいえ、新刊が出ているのであれば、そちらに切り替えたほうがいいかもしれませんね。
MyAero

2025/04/27 05:06

ありがとうございます。 Collapseでまとめても、NullReferenceException: Object reference not set to an instance of an object の1行しかありませんでした。 (Collapseについて勉強になりました、ありがとうございます。) 新しいテキスト(2023年版)のサンプルがネット上にあったので、そちらのコードを使用してみましたが、全く同じエラーが発生しました。 お二方が見る限りでは、DistanceはNullではなさそう(New Textで初期化されている?)、 ということでしょうか。
fiveHundred

2025/04/27 05:13

「Nullではありません」すら出ないのは変です。 「Console.Write("Nullです");」をDebug.Logに直してみてください。
MyAero

2025/04/27 05:49

Debug.Log に直したところ、ログが表示されるようになりました! Nullです、のエラーが表示されていたので、コードを再確認すると、 2023年版のコードでは16行目の this.distance = GameObject.Find("Distance"); のDistanceの頭が小文字になっていました。 これを大文字に直すと、「Nullではありません」の表示になり、 動作が正常になりました。 もともとのコードはきちんと大文字になっていたので、スペルミスとは別の原因だったと思います。 2019版の教科書だと、UIがTextになっているのですが、2023年版だとTextMeshProになっており、usingで使用するモジュールがusing UnityEngine.UI; から using TMPro; に変わっているところが怪しいな、と感じました。。。 一旦、学習を前に進めることができそうです。 再びエラーが発生しましたら、今のUnityに対応していない可能性も考えて、最新のサンプルコードを使ってみたいと思います。 誠にありがとうございました!
logres_Fan

2025/04/27 05:50

> 新しいテキスト(2023年版)のサンプルがネット上にあったので、 それって古いテキストみたいですよ?
fiveHundred

2025/04/27 07:39

個人な意見ですが、他の本にしたほうがいいかもしれません。 「GameObject.Find()」はオブジェクトの名前を変えるだけで機能しなくなるので、どうしても必要な時以外は使うべきではないと思っています。 「public」や「[SerializeField]」をつけると、エディタ上から設定できるようになるので、それを使っている本のほうがいいですね。
MyAero

2025/04/27 12:11

ありがとうございます。 オブジェクトの名前をUnity上で変えたときに、プログラムのほうを修正しなくてよくなるということでしょうか。 ※詳細は勉強してみます。 アドバイスいただいた通り、別の本も目を通してみたいと思います。 (今の本でも、ゲーム作りのいろはがいい感じにまとまっている印象はあるので、一旦最後までしゃぶっておきたいと思います)
fiveHundred

2025/04/27 12:21

> オブジェクトの名前をUnity上で変えたときに、プログラムのほうを修正しなくてよくなるということでしょうか。 それで合ってます。 オブジェクトを直接指定しているので、オブジェクト自体を削除したりしない限り、名前を変えても問題ないようになります。
MyAero

2025/04/27 13:26

なるほど、それは便利そうですね。 自力ではしばらくたどり着けなかった情報だと思うので非常に助かります。
guest

回答1

0

自己解決

最新のテキストのサンプルコードをネット上からダウンロードしてコピペした。
2019版のサンプルコードをコピペしてもエラー解消しなかったので、
スペルミスなどではなかった。
どうやら、UIがTextからTextMeshProに代わっており、
使用するモジュールを修正する必要があるようだった。

ーー追記ーー
carやflagのオブジェクトをヒエラルキーウィンドウに移動させた際、
勝手にオブジェクトの名前がcar_0やflag_0に変わっていた。
これのせいでこの2つのオブジェクトがNullになっていた可能性もある?。

※アドバイスをいただいた方、大変ありがとうございました。

投稿2025/04/27 05:56

編集2025/04/27 12:12
MyAero

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問