teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

解決後。当Q&Aを参照して来られた方に完結に解法を伝えるため。

2018/11/04 19:58

投稿

Sado
Sado

スコア89

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,15 @@
1
+ ### 【まとめ】【解決後の追記】
2
+
3
+ 解決まで非常に遠回りをしてしまいましたので、簡潔にまとめさせていただきます。
4
+ 今回NullReferenceExceptionが出たのですが、エラーとして示された行に存在するメソッド・クラス型変数(?)に焦点をあててしまったことから見逃してしまった凡ミスです。
5
+ 空参照エラーの行に存在するスクリプトやメソッドとは**少し別の箇所で定義したもの**が原因でした。
6
+
7
+ というのも、あるゲームオブジェクトにアタッチしたスクリプトから別のゲームオブジェクトのスクリプトのメソッドを呼び出していたのですが、この時に別のオブジェクトの参照を得るべき箇所で無理やりスクリプトそのものをねじ込もうとしていました。
8
+
9
+ スクリプト冒頭で`[SerializeField] private GameObject gmObj;`と書き`Start()`内でスクリプトコンポーネントの参照を得るべきところで、`[SerialzeField] private Script-Name scObj;`と書いてしまっていました。インスペクター側の項目もわけのわからないものを参照していました。
10
+
11
+ 初心者あるあるとでも思わないとやってられない凡ミスです。基礎といいますか、扱うデータ型を疎かにしすぎです。Java勉強中とは口が裂けても言えません。
12
+
1
13
  ### 前提・実現したいこと
2
14
 
3
15
  特別なアイテム、通常のアイテム(それぞれGameObject)を確立で生成するプログラムを作成しています。

3

分かったことと、新たな不明点の追記。

2018/11/04 19:58

投稿

Sado
Sado

スコア89

title CHANGED
File without changes
body CHANGED
@@ -85,6 +85,14 @@
85
85
  となると、余計に分かりません。
86
86
  何かちょっとしたヒントでもいいので、突破口に成るような何かが見つかるといいのですが......
87
87
 
88
+ ### デバッグ状況2(追記)
89
+ Item型のインスタンスを、ItemManagerクラスのtargetItemに参照を格納し、壊れるとアイテムを出現させるBoxクラスからItemManagerクラスのmakeItems()を実行するとエラーが発生することがわかりました。
90
+ ItemクラスのGetGameObject()だけでなく、Itemクラス内の全メソッドにおいて同様のエラーが発生します。
91
+ その条件は恐らくですが、「BoxクラスからItemManagerクラスのメソッドを呼び出す。そのメソッドがまたItemクラスのメソッドを呼び出す」といった構造をしていることだと思いましたが、それをどのように解決させるか検討もつきません。
92
+ 「BoxクラスからItemManagerクラスのメソッドを呼び出す。そのメソッドがItemクラスのインスタンスの参照そのものを表示する」という先よりも一段階少ない工程でデバッグしてみると、ヌルにはなりませんでした。
93
+
94
+ HSP言語のループのように、C#のメソッドを呼び出す深さ(ネスト)が3つくらいと言った、Unity C#特有の制限があるのでしょうか。
95
+
88
96
  ### 補足情報(FW/ツールのバージョンなど)
89
97
 
90
98
  Unity2018 2.0f2、VS2017、Windows 10 home 64bit。

2

分かったことの追記

2018/11/02 17:30

投稿

Sado
Sado

スコア89

title CHANGED
File without changes
body CHANGED
@@ -76,6 +76,15 @@
76
76
  また、Box.cs内で宝箱破壊時に効果音を再生`adse.Play();`しているのですが、今回のエラー発生時、`Destroy(gameObject);`されずに残っているのかSEが無限再生されるように暴走します。
77
77
  特別なアイテムを生成しない、通常アイテムを生成する時はSEやDestroyに異常は感じられませんでした。
78
78
 
79
+ ### デバッグ状況1(追記)
80
+ `targetItem.GetGameObject()`の補足をしますと、targetItemはItem型の変数でアイテムの各種情報(名前や属性,説明,GameObjectなど)をprivate typeで格納しています。この中にGameObjectがあり、`GetGameObject()`で取得できるようになっています。
81
+ ここで、Item型のGetGameObjectは他の場所でも頻繁に利用していて問題が起きていないために見落としていましたが、問題の箇所で`targetItem`のみで確認してみたところヌルリファレンスエラーは発生しませんでした。
82
+ 問題のメソッド内で<Item>.GetGameObject()を須いたときのみエラーが発生するらしいことまでが分かりました。
83
+
84
+ しかし、「targetItemの中身はどの時点でも空ではない」「GetGameObject()はprivateな変数を返すだけのメソッド」「Item型の実体の方も問題のメソッド以外では参照が確認できる」「Item型の実体の方でGameObjectの参照を格納する変数に変更を加える(代入する)処理は一切書き込んでいない」
85
+ となると、余計に分かりません。
86
+ 何かちょっとしたヒントでもいいので、突破口に成るような何かが見つかるといいのですが......
87
+
79
88
  ### 補足情報(FW/ツールのバージョンなど)
80
89
 
81
90
  Unity2018 2.0f2、VS2017、Windows 10 home 64bit。

1

初心者マーク表示、一部言い回し修正。

2018/11/02 16:56

投稿

Sado
Sado

スコア89

title CHANGED
File without changes
body CHANGED
@@ -4,7 +4,7 @@
4
4
  今回、特別なアイテムを参照する`targetItem.GetGameObject()`で空参照エラーが頻発しました。
5
5
 
6
6
  ### 発生している問題・エラーメッセージ
7
- 特定の箇所でのみInstantiate()を実行しようとすると"NullReferenceException: Object reference not set to an instance of an object"されてしいます。
7
+ 特定の箇所でのみInstantiate()を実行しようとすると"NullReferenceException: Object reference not set to an instance of an object"が表示されます。
8
8
  ```
9
9
  NullReferenceException: Object reference not set to an instance of an object
10
10
  ItemManager.makeItems (Int32 n, Vector3 vec3) (at Assets/Scripts/ItemManager.cs:71)