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)
まず、どこがnullになっているか、デバッガやDebug.Log()などで確認しましょう。
私が思うに、「this.distance」か「this.distance.GetComponent<Text>()」のどちらかがnullになっていそうな気がします。
ありがとうございます。
大変申し訳ないのですが、デバッグログの出力方法について教えていただけないでしょうか💦
void Startの中に以下のコードを入れてみたりはしたのですが、
Debug.LogやConsole.Writeなどがどこに出力されるのかも理解しておらず。。。基礎中の基礎過ぎるのか、ネット上にも情報がなく(応用知識はたくさん見つかりました)、難航しております。
if (this.distance == null)
{
Console.Write("Nullです");
}
else
{
Console.Write("Nullではありません");
}
エラーと同じConsoleウィンドウに出力されるはずです。
あと、「Distance」オブジェクトの中身はどうなっていますか?
そちらが原因な気がしてきました。
ありがとうございます。
質問にDistanceの設定に関する画面キャプチャを追加しました。
画像の通り、New Text という文字を入れています。
エラーについても、一画面に収まったのでついでにキャプチャをとったのですが、
画面の通り、Consoleの結果が出力されませんでした。
Nullであれば、Consoleウィンドウに「Nullです」と出るはず、という理解で間違いないでしょうか。
新刊が発売されているみたいですよ?
エラーで表示が流れてしまっているのではないでしょうか?
(Collapseをクリックすれば、同じエラーをまとめることができます)
とはいえ、新刊が出ているのであれば、そちらに切り替えたほうがいいかもしれませんね。
ありがとうございます。
Collapseでまとめても、NullReferenceException: Object reference not set to an instance of an object
の1行しかありませんでした。
(Collapseについて勉強になりました、ありがとうございます。)
新しいテキスト(2023年版)のサンプルがネット上にあったので、そちらのコードを使用してみましたが、全く同じエラーが発生しました。
お二方が見る限りでは、DistanceはNullではなさそう(New Textで初期化されている?)、
ということでしょうか。
「Nullではありません」すら出ないのは変です。
「Console.Write("Nullです");」をDebug.Logに直してみてください。
Debug.Log に直したところ、ログが表示されるようになりました!
Nullです、のエラーが表示されていたので、コードを再確認すると、
2023年版のコードでは16行目の this.distance = GameObject.Find("Distance");
のDistanceの頭が小文字になっていました。
これを大文字に直すと、「Nullではありません」の表示になり、
動作が正常になりました。
もともとのコードはきちんと大文字になっていたので、スペルミスとは別の原因だったと思います。
2019版の教科書だと、UIがTextになっているのですが、2023年版だとTextMeshProになっており、usingで使用するモジュールがusing UnityEngine.UI; から using TMPro; に変わっているところが怪しいな、と感じました。。。
一旦、学習を前に進めることができそうです。
再びエラーが発生しましたら、今のUnityに対応していない可能性も考えて、最新のサンプルコードを使ってみたいと思います。
誠にありがとうございました!
> 新しいテキスト(2023年版)のサンプルがネット上にあったので、
それって古いテキストみたいですよ?
個人な意見ですが、他の本にしたほうがいいかもしれません。
「GameObject.Find()」はオブジェクトの名前を変えるだけで機能しなくなるので、どうしても必要な時以外は使うべきではないと思っています。
「public」や「[SerializeField]」をつけると、エディタ上から設定できるようになるので、それを使っている本のほうがいいですね。
ありがとうございます。
オブジェクトの名前をUnity上で変えたときに、プログラムのほうを修正しなくてよくなるということでしょうか。
※詳細は勉強してみます。
アドバイスいただいた通り、別の本も目を通してみたいと思います。
(今の本でも、ゲーム作りのいろはがいい感じにまとまっている印象はあるので、一旦最後までしゃぶっておきたいと思います)
> オブジェクトの名前をUnity上で変えたときに、プログラムのほうを修正しなくてよくなるということでしょうか。
それで合ってます。
オブジェクトを直接指定しているので、オブジェクト自体を削除したりしない限り、名前を変えても問題ないようになります。
なるほど、それは便利そうですね。
自力ではしばらくたどり着けなかった情報だと思うので非常に助かります。

回答1件
あなたの回答
tips
プレビュー