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

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

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

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

Unity

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

Q&A

解決済

2回答

1891閲覧

NullReferenceExceptionというエラーが出た

wata3

総合スコア16

C#

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

Unity

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

0グッド

0クリップ

投稿2020/06/14 14:47

前提・実現したいこと

Unityでカードゲームを作ろうとしています。
前回の質問で無駄な長文が簡略化できそうなんですが、
試しで一部のカードだけ表示しようとしたら下記のエラーが出ました。
どこを修正したらいいと思いますか?
スクリプトを割り当てたオブジェクトの割り当て(?)はこうなっています。
イメージ説明

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

NullReferenceException: Object reference not set to an instance of an object CardSearch.Start () (at Assets/DeckEdit/Script/CardSearch.cs:115)

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using System; 6using System.Linq; 7public class CardModelU 8{ 9 public string id; 10 public string name1; 11 public string name2; 12 public int level; 13 public string type; 14 public int attack; 15 public int defence; 16 public string tag; 17 public string effect1; 18 public string effect2; 19 public string effect3; 20 } 21public class CardModelS 22{ 23 public string id; 24 public string name1; 25 public string name2; 26 public int level; 27 public string type; 28 public string kind; 29 public string tag; 30 public string effect1; 31 public string effect2; 32 public string effect3; 33 public string effect4; 34} 35public class CardModelI 36{ 37 public string id; 38 public string name1; 39 public string name2; 40 public int level; 41 public string type; 42 public string kind; 43 public string tag; 44 public string effect1; 45 public string effect2; 46 public string effect3; 47 public string effect4; 48} 49public class CardSearch : MonoBehaviour 50{ 51 List<CardModelU> allUnitList; 52 List<CardModelS> allSpelList; 53 List<CardModelI> allItemList; 54 public InputField Level; 55 public InputField ATK; 56 public InputField DEF; 57 public InputField Text; 58 public Dropdown kindDD1; 59 public Dropdown kindDD2; 60 public Dropdown Type; 61 //int Lv, atk, def,i; 62 public GameObject SearchArea; 63 public GameObject CardData; 64 public GameObject CardID_; 65 GameObject Obj; 66 [SerializeField] private unit unit; 67 [SerializeField] private item item; 68 [SerializeField] private spel spel; 69 70 public void CardSEARCH() 71 { 72 foreach (Transform child in SearchArea.transform) 73 { 74 Destroy(child.gameObject); 75 } 76 IEnumerable<CardModelU> result = allUnitList; 77 78 if (Level.text != "") 79 { 80 result = result.Where(s => s.level.ToString() == Level.text); 81 } 82 if (ATK.text != "") 83 { 84 result = result.Where(s => s.attack.ToString() == ATK.text); 85 } 86 if (DEF.text != "") 87 { 88 result = result.Where(s => s.defence.ToString() == DEF.text); 89 } 90 if (Text.text != "") 91 { 92 result = result.Where(s => s.name1.ToString().Contains(Text.text) || 93 s.name2.ToString().Contains(Text.text) || 94 s.effect1.ToString().Contains(Text.text) || 95 s.effect2.ToString().Contains(Text.text) || 96 s.effect3.ToString().Contains(Text.text)); 97 } 98 foreach (CardModelU modelU in result) ShowU(modelU); 99 } 100 public void ShowU(CardModelU modelU) 101 { 102 CardData.GetComponent<CardD>().ShowU(modelU); 103 Obj = Instantiate(CardData, this.transform.position, Quaternion.identity); 104 Obj.GetComponent<CardID>().cardID = modelU.id; //この辺のIDの取り回しは要確認 105 Obj.transform.parent = SearchArea.transform; 106 } 107 void Start() 108 { 109 int UD = unit.Sheet1.Count; 110 int SD = spel.Sheet1.Count; 111 int ID = item.Sheet1.Count; 112 for (int i = 0; i < UD; i++) 113 { 114 allUnitList[i].id = unit.Sheet1[i].id; 115 allUnitList[i].name1 = unit.Sheet1[i].name1; 116 allUnitList[i].name2 = unit.Sheet1[i].name2; 117 allUnitList[i].level = unit.Sheet1[i].level; 118 allUnitList[i].type = unit.Sheet1[i].type; 119 allUnitList[i].attack = unit.Sheet1[i].attack; 120 allUnitList[i].defence = unit.Sheet1[i].defence; 121 allUnitList[i].tag = unit.Sheet1[i].tag; 122 allUnitList[i].effect1 = unit.Sheet1[i].effect1; 123 allUnitList[i].effect2 = unit.Sheet1[i].effect2; 124 allUnitList[i].effect3 = unit.Sheet1[i].effect3; 125 // allUnitList[i].effect4 = unit.Sheet1[i].effect4; 126 } 127 for (int i = 0; i < SD; i++) 128 { 129 allSpelList[i].id = spel.Sheet1[i].id; 130 allSpelList[i].name1 = spel.Sheet1[i].name1; 131 allSpelList[i].name2 = spel.Sheet1[i].name2; 132 allSpelList[i].level = spel.Sheet1[i].level; 133 allSpelList[i].type = spel.Sheet1[i].type; 134 allSpelList[i].tag = spel.Sheet1[i].tag; 135 allSpelList[i].effect1 = spel.Sheet1[i].effect1; 136 allSpelList[i].effect2 = spel.Sheet1[i].effect2; 137 allSpelList[i].effect3 = spel.Sheet1[i].effect3; 138 allSpelList[i].effect4 = spel.Sheet1[i].effect4; 139 } 140 for (int i = 0; i < ID; i++) 141 { 142 allItemList[i].id = item.Sheet1[i].id; 143 allItemList[i].name1 = item.Sheet1[i].name1; 144 allItemList[i].name2 = item.Sheet1[i].name2; 145 allItemList[i].level = item.Sheet1[i].level; 146 allItemList[i].type = item.Sheet1[i].type; 147 allItemList[i].tag = item.Sheet1[i].tag; 148 allItemList[i].effect1 = item.Sheet1[i].effect1; 149 allItemList[i].effect2 = item.Sheet1[i].effect2; 150 allItemList[i].effect3 = item.Sheet1[i].effect3; 151 allItemList[i].effect4 = item.Sheet1[i].effect4; 152 } 153 } 154}

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

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

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

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

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

guest

回答2

0

ベストアンサー

最初に

そのコードは wata3 さんが書いたのですから、実装を一番理解している人も当然 wata3 さんです。
ですから、どう修正するべきかは本来人に聞くことではありません。
どう作りたいか、どう修正したいかは wata3 さんが考えることです。

考えるべき・実践すべきこと

どう修正するべきかを考える前に、まずは原因を知りましょう。
当たり前ですが、原因が分からなければどう修正するべきかはわかるはずがありません

例外が出たときの最初の手がかりはエラーの内容を知ることです。
エラーの内容を知るには、Unity上のコンソールもしくはVisual Studioで表示されているそのメッセージ(NullReferenceException~)を読みましょう。

このメッセージはエラーを修正するのに非常に有効な情報です。
例えば、エラーメッセージを読むと**「どのファイル」の「どんなメソッド」の「どの行」で** 例外が発生しているか、具体的に教えてくれるのです。

実際に読んでみると「 Assets/DeckEdit/Script/CardSearch.cs の115行目にある CardSearch クラスの Start メソッドの中で NullReferenceException が発生している」と分かりますね。
※ ですから、まずは質問する前にエラーの内容をよく読みましょう。このような作業を他人にやらせてはいけません。teratailにおいて非推奨な質問でもあります。

次に、エラーメッセージが読めないというケースがあるかもしれません。
そうであれば、まずはその意味を理解するところから始めましょう。
どう具体的に理解していくかは下記3点の例を参考にしてください。

  • NullReferenceException がどういう例外なのか分からなければそれを理解するところから
  • そもそも「例外」とは何なのかが分からなければそれを理解するところから
  • 他にもそのメッセージに不明点があればそれを理解するところから

このように不明点を虱潰しで解消していけば、やっと今回の問題をおおよそ理解することができます。

問題が理解できれば、後はその例外が発生しないようコードを修正したり、Unity上の設定を見直せば良いのです。手を動かしましょう。
※ デバッグを行う際はツールを使ってください。Visual Studioであればデバッグツールの一つであるブレークポイントを使って変数の状態を見ることができます。Unityはどうだったか覚えていません。なので、Visual Studioと連携するのも手だと思います。
※ もし上記のようなデバッグの方法を誰からも教わっていなければ、これから覚えて実践しましょう。

最後に

とはいえ、質問に直結しない回答だけをするのも、wata3 さんにとっては荷が重く、困るだろうと思うので、気になるところをざっくり挙げます。

ただし、実際の検証は wata3 さんが行ってください。
※この作業(デバッグ)は人にやらせてはいけません

気になるところ

そもそも115行目がどこを指しているのかよくわかりませんが、VSCodeで添付したコードを貼り付けて行番号を見たところ allUnitList[i].id = unit.Sheet1[i].id; 辺りで例外が発生しているように見受けられました。

NullReferenceException とのことなので、きっと allUnitList[i] もしくは unit.Sheet1[i] のどちらか、またはその両方が null なのでしょう。もし NullReferenceException が何か理解したのであれば、他の spel.Sheet1[i]item.Sheet1[i] にも同様の問題がないかを確認してください。

投稿2020/06/14 18:22

編集2020/06/14 18:56
BluOxy

総合スコア2663

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

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

wata3

2020/06/14 22:30

allUnitList、allSpelList、allItemListが初期化されていなかったためNullになっていたようでした。 結果別のエラーが出たのですが、もっと検証してから質問したいと思います。ありがとうございました。
guest

0

ナカミがnullの変数にアクセスしようとした、という例外です
その例外が出たところの変数の値をチェックして、nullになってるのを探そう

投稿2020/06/14 14:49

y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問