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

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

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

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

Null

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

Unity

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

Q&A

解決済

3回答

2758閲覧

コンポーネントの取得でのNullエラーの解消法

kaboche

総合スコア2

C#

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

Null

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

Unity

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

0グッド

0クリップ

投稿2020/07/26 08:10

前提・実現したいこと

UnityにてInputFieldを用いて鍵番号で開く金庫のイベントを作成しています。現在Nullエラーが解消できずイベントが作成できないため、Nullエラーの解消法を知りたいです。
InputFieldは他のオブジェクトでも使用するので、表示する部分とイベントの内容を別クラスにしています。

発生している問題・エラーメッセージ

表1で表2のNullエラーが発生しています。上記部分が取得できないだけなら取得方法を変えればよいのですが、同じスクリプトの63行目(表3)は取得できていたのでなぜエラーが出ているかわからず質問させていただきました。

表1

c#

1inputFeildController.inputField.onEndEdit.AddListener(data => InputFieldEvent());

表2

NullReferenceException: Object reference not set to an instance of an object UnderSafeEvent.Start () (at Assets/OriginalGame/Scripts/UnderSafeEvent.cs:33)

表3

c#

1var inputText = inputFeildController.inputField.text;

該当のソースコード

関係のありそうなスクリプト全文を下記いたします。

表4

C#

1using System.Collections; 2using System.Collections.Generic; 3using TMPro; 4using UnityEngine; 5using UnityEngine.EventSystems; 6using UnityEngine.UI; 7 8public class UnderSafeEvent : MonoBehaviour 9{ 10 //イベントトリガー 11 private EventTrigger eventTrigger; 12 private EventTrigger.Entry entry1; 13 14 //テキストを管理するスクリプト 15 private TextController[] textControllers; 16 17 //メモ管理用スクリプト 18 private MemoController memoController; 19 20 //InputField管理用のスクリプト 21 private InputFeildController inputFeildController; 22 23 //鍵番号 24 public string keyNum; 25 26 // Start is called before the first frame update 27 void Start() 28 { 29 //InputFieldControllerを取得 30 inputFeildController = gameObject.GetComponent<InputFeildController>(); 31 32 //InputFieldにイベントを登録 33 inputFeildController.inputField.onEndEdit.AddListener(data => InputFieldEvent()); 34 35 //テキスト管理のスクリプトを取得 36 textControllers = gameObject.GetComponents<TextController>(); 37 38 //メモ管理用スクリプトを取得 39 memoController = gameObject.GetComponent<MemoController>(); 40 } 41 42 // Update is called once per frame 43 void Update() 44 { 45 46 } 47 48 public void ChengeEvent() 49 { 50 //現在のイベントを非アクティブにする 51 gameObject.GetComponent<EventTrigger>().enabled = false; 52 53 //別のイベントを追加する 54 eventTrigger = gameObject.AddComponent<EventTrigger>(); 55 entry1 = new EventTrigger.Entry(); 56 entry1.eventID = EventTriggerType.PointerClick; 57 entry1.callback.AddListener(data => memoController.StartEvent()); 58 eventTrigger.triggers.Add(entry1); 59 } 60 61 public void InputFieldEvent() 62 { 63 var inputText = inputFeildController.inputField.text; 64 65 if(inputText == "0000") 66 { 67 Debug.Log("開いたよ"); 68 inputFeildController.RemoveInputField(); 69 textControllers[0].ActiveText(); 70 textControllers[0].UpdateText(); 71 ChengeEvent(); 72 } 73 else 74 { 75 Debug.Log("開かないよ"); 76 inputFeildController.RemoveInputField(); 77 textControllers[1].ActiveText(); 78 textControllers[1].UpdateText(); 79 } 80 } 81}

表5

c#

1using System.Collections; 2using System.Collections.Generic; 3using TMPro; 4using UnityEngine; 5 6public class InputFeildController : MonoBehaviour 7{ 8 //InputField表示用のUI 9 private GameObject inputFieldUI; 10 //パス入力用のInputField 11 public TMP_InputField inputField; 12 13 // Start is called before the first frame update 14 void Start() 15 { 16 //表示用のUIを取得 17 inputFieldUI = GameObject.Find("InputFieldUI").transform.Find("InputField").gameObject; 18 //InputFieldを取得 19 inputField = inputFieldUI.GetComponentInChildren<TMP_InputField>(); 20 } 21 22 // Update is called once per frame 23 void Update() 24 { 25 26 } 27 28 public void ActiveInputField() 29 { 30 //InputFieldを表示する 31 inputFieldUI.SetActive(true); 32 Time.timeScale = 0; 33 } 34 35 public void RemoveInputField() 36 { 37 //InputFieldを非表示にする 38 inputFieldUI.SetActive(false); 39 Time.timeScale = 1; 40 } 41} 42

試したこと

表1のコードの上に表6と表7を入力して実行したところ表6は取得できていて表7はNullでした。
また、表3の上に表7を入力して実行した場合はコンポーネントを取得できていて、その後の処理も問題なく実行できました。
表5のコンポーネント取得は問題なくされていました。

表6

C#

1Debug.log(inputFeildController);

表7

C#

1Debug.log(inputFeildController.inputField)

補足情報(FW/ツールのバージョンなど)

Unity2018.4.23f1
VisualStudio2019

不明点や不足の情報があればご連絡ください。
宜しくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

・原因
Nullが発生したり問題無かったりするのは下記の順で処理が行われているせいです。

--ゲーム起動時の処理--
1.UnderSafeEventクラスのStart-inputFieldが代入されてないのでNull
2.InputFeildControllerクラスのStart-inputFieldに値が代入

--ゲーム中の処理--
3.UnderSafeEventクラスのInputFieldEvent-inputFieldが代入されているのでNullにならない

・解決法
二通りあります。

・InputFeildControllerクラスのvoid Start()public void Init()などに書き換えNullが発生する前に呼び出す。
書き換える関数名は一例なのでInitでなくとも何でも良いです。
Nullエラーが発生している直ぐ上に書き込めば解決するかと思います。

C#

1inputFeildController.Init(); 2inputFeildController.inputField.onEndEdit.AddListener(data => InputFieldEvent());

・InputFeildControllerクラスのpublic TMP_InputField inputField;に予め値を代入しておく

InputFeildControllerを付けているオブジェクトを選択すると下記画像の様になっている筈なので赤枠部分にInputFieldをドラッグ&ドロップすると代入できます。
代入出来ていればNullエラーが発生しなくなります。
イメージ説明

投稿2020/07/26 11:45

Hawn

総合スコア1222

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

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

kaboche

2020/07/26 15:48

ご回答ありがとうございます。 回答いただいた方法を試したら解決いたしました。 起動時のStart関数の呼び出されるタイミングが原因だったんですね。大変勉強になりました。
guest

0

まず、以下の2点を確認することから始めるといいと思います。

  1. どの変数が null だったのか
  2. どの GameObject で問題が起きているのか

後者を忘れがちですが、Unity ではここが重要です。
とりあえずエラーが出る該当行にブレークポイントを張ってデバッグ実行して前者を特定し、その時に後者も特定してみてください。

スクリプトのアタッチミス、オブジェクトのアサインミスも念頭に置いて調べてください。

投稿2020/07/26 11:03

bboydaisuke

総合スコア5308

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

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

kaboche

2020/07/26 15:54

ご回答ありがとうございます。 教えていただいた記事も大変参考になりました。
guest

0

nullがでるなら、nullかどうかチェックすればいいのでは

投稿2020/07/26 08:29

y_waiwai

総合スコア88042

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

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

kaboche

2020/07/26 16:00

ご回答ありがとうございます。 すみません。私が変数のnullチェックを知りませんでした。 勉強になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問