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

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

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

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Unity

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

Q&A

2回答

1166閲覧

オブジェクト参照をオブジェクトのインスタンスに設定したい

pokapoka2804

総合スコア15

C#

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Unity

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

1グッド

1クリップ

投稿2019/03/06 10:18

編集2022/01/12 10:55

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

NullReferenceException: Object reference not set to an instance of an object CreateSlotScript.OnEnable ()(at Assets/sozai dress/CreateSlotScript.cs:17) Google翻訳 NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません 17行目 CreateSlot (itemDataBase.GetItemData ());

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5public class CreateSlotScript : MonoBehaviour 6{ 7 [SerializeField] 8 private GameObject slot; 9 // 主人公のステータス 10 [SerializeField] 11 private MyItem myItem; 12 // アイテムデータベース 13 [SerializeField] 14 private ItemDataBase itemDataBase; 15 void OnEnable() { 16 // アイテムデータベースに登録されているアイテム用のスロットを全作成 17 17行目 CreateSlot (itemDataBase.GetItemData ()); 18 } 19 // アイテムスロットの作成 20 public void CreateSlot(ItemData[] itemList) { 21 22 int i = 0; 23 24 foreach (var item in itemList) { 25 if(myItem.GetItemFlag (item.GetItemType ())) { 26 // スロットのインスタンス化 27 var instanceSlot = Instantiate (slot) as GameObject; 28 // スロットゲームオブジェクトの名前を設定 29 instanceSlot.name = "ItemSlot" + i++; 30 // 親をMainにする 31 instanceSlot.transform.SetParent (transform); 32 // Scaleを設定しないと0になるので設定 33 instanceSlot.transform.localScale = new Vector3 (1f, 1f, 1f); 34 // アイテム情報をスロットのProcessingSlotに設定する 35 instanceSlot.GetComponent <ProcessingSlot>().SetItemData (item); 36 } 37 } 38 } 39} 40 41 42using System.Collections; 43using System.Collections.Generic; 44using UnityEngine; 45 46public class ItemDataBase : MonoBehaviour 47{ 48 ItemData[] itemlists = new ItemData[2]; 49 50 // Start is called before the first frame update 51 void Awake() 52 { 53 itemlists [0] = new ItemData (Resources.Load ("prefab name", typeof(Sprite))as Sprite, "namae",MyItem.Item.FlashLight, "info"); 54 itemlists [1] = new ItemData (Resources.Load ("prefab name2", typeof(Sprite))as Sprite, "nam",MyItem.Item.FlashLight, "info"); 55 56 } 57 public ItemData[] GetItemData() { 58 return itemlists; 59 } 60 public int GetItemTotal() { 61 return itemlists.Length; 62 } 63}

試したこと

あるブログを参考にしていて、メッセージ(質問)を送ろうとしたら送信できませんでした。
(その後、色々調べて試行錯誤したが他のエラーが出てしまう)

追記
17行目 CreateSlot (itemDataBase.GetItemData ());
からCreateSlot関数にデータを渡す?時に問題があるようです
(Awake()やOnEnable()はDebug.Log()を使うとコンソールに表示されるので)

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

unity 2018.3.3f1
よろしくおねがいします

bochan2👍を押しています

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

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

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

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

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

bochan2

2019/03/06 10:30

質問頂きありがとうございます。 コピペに改行が含まれているかが分からない、17行目がどこにあるのかを追記していただけないでしょうか?
pokapoka2804

2019/03/06 10:37

コメントありがとうございます 17行目は CreateSlot (itemDataBase.GetItemData ()); です 追記もしました
guest

回答2

0

itemDataBaseがinspectorで設定されていないので設定してください。

ItemDatabaseを以下のようにして
CreateSlotScriptのOnEnable内でitemDataBase=new ItemDataBase();をやってください。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ItemDataBase 6{ 7 ItemData[] itemlists = new ItemData[2]; 8 9 public ItemDataBase() 10 { 11 itemlists [0] = new ItemData (Resources.Load ("prefab name", typeof(Sprite))as Sprite, "namae",MyItem.Item.FlashLight, "info"); 12 itemlists [1] = new ItemData (Resources.Load ("prefab name2", typeof(Sprite))as Sprite, "nam",MyItem.Item.FlashLight, "info"); 13 14 } 15 public ItemData[] GetItemData() { 16 return itemlists; 17 } 18 public int GetItemTotal() { 19 return itemlists.Length; 20 } 21}

投稿2019/03/06 10:53

編集2019/03/07 00:43
bochan2

総合スコア2050

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

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

pokapoka2804

2019/03/06 11:11 編集

CreateSlotScriptのinspectorにはアセットにもシーンにもスクリプトたちが表示されずItemDataBaseScriptを設定できませんでした(プロジェクトビュー) CreateSlotScriptをつけているパネルから ItemDataBaseScriptをつけているオブジェクトを設定することはできますが CreateSlotScript.CreateSlot (.ItemData[] itemList) (at Assets/sozai dress/CreateSlotScript.cs:25) というエラーが新しく出てきます(ヒエラルキービュー) 25行目 if(myItem.GetItemFlag (item.GetItemType ())) {
bochan2

2019/03/06 13:17

ItemDataBaseScriptのコードも質問欄に追記していただけないでしょうか?
pokapoka2804

2019/03/06 15:15

追記しました おねがいします
pokapoka2804

2019/03/07 14:30 編集

スクリプトを修正してみましたが やはり17行目に問題があるようです 元に戻して、下の様なものを加えてみましたが ItemData[] itemLists = itemDataBase.GetItemData ();とcreateSlotScript.CreateSlot ();の部分が上手くいきません ItemDataBasescript void Update () { if (Input.GetKeyDown (KeyCode.Q)) { UI.SetActive (!UI.activeSelf); if(UI.activeSelf) { Time.timeScale = 0f; createSlotScript = GameObject.Find ("Main").GetComponent<CreateSlotScript> (); createSlotScript.CreateSlot (); // ポーズUIが表示されてなければ通常通り進行 } else { Time.timeScale = 1f; } } } (CreateslotにあったOnEnable()でしていたことをUpdate()ですることに変更) CreateSlotScript public void CreateSlot() { ItemData[] itemLists = itemDataBase.GetItemData ();
guest

0

タイトルからエラーの内容が多分わかっていないのかと思ったので、
まずエラーの説明をします。
NullReferenceException:処理を行おうとしたときに、
使用するオブジェクトの参照ができないというエラー
たとえば、
1:変数の初期化が行われていない
2:中に何もはいっていない
とかです。このエラーはよく出ます。なので理解しておいたほうがいいです。

CreateSlotScript.cs:17
17行目で発生しているエラーですが、
CreateSlot (itemDataBase.GetItemData ());
ここの処理内の"どこか"で起きていると教えてくれています。

itemDataBase.GetItemData ():ItemDataBaseクラスのitemlistsを取得するメソッド
returnしたitemlistsの初期化がされていなければ、
CreateSlotメソッドにいけないので、
17行目のNullReferenceExceptionが発生します。

itemlistsは参照できる形で取得できている場合
CreateSlotメソッド内でエラーが発生した場合も、17行目の処理を行っている途中でエラーとなるので、
17行目のエラーとして返ってきます。

17行目の場合、
itemDataBase.GetItemData ()
CreateSlot
このメソッド内のどちらかでNullReferenceExceptionが発生しています。
どこで出たか把握したい場合は一行ずつデバッグ実行していったらわかります。

で、今回の原因は多分Awake()が呼び出されてないと思うので、
ItemDataBaseをアクティブ化してください。

投稿2019/03/07 06:01

pontaq

総合スコア31

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

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

pokapoka2804

2019/03/07 15:27 編集

コメントありがとうございます 「ItemDataBaseをアクティブ化してください。 」 ItemDataBaseをつけているオブジェクトは既にアクティブです(非表示ではないです)が、こういうことではないですか? 「returnしたitemlistsの初期化がされていなければ、 CreateSlotメソッドにいけないので、 17行目のNullReferenceExceptionが発生します。 」 itemlistsを初期化するとAwake()でいれたものがなくなってしまいませんか? 追記 Awake()、OnEnable()内でDebugするとコンソールに表示されました。しかし、public void CreateSlot(~~~)内では表示されていないのでpublic void CreateSlot(~~~)は行われていないと考えました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問