【初学者必見】Unityの実行時エラーの9割はNullReferenceExceptionだよね

この記事は2017年5月29日に書かれたものです。内容が古い可能性がありますのでご注意ください。


Unityの実行時エラーの9割はNullReferenceExceptionだよね


9割は言い過ぎかもしれませんが、体感的にはそれぐらいです。
実際、「なんか動きません!」って相談のほとんどが NullReferenceException です。

特に本とか買ってきて勉強を始めたUnity初学者がやりがちですね。
書籍ってその通りにやれば上手くいくんですけど、失敗した時の対処法はあまり書かれていません。
今回はこのエラーがどういうものか?何故起きて、どうすれば解決できるのか紹介したいと思います。

※使用しているUnityのバージョンは5.5.2f1です。

NullReferenceExceptionはどんなエラーか?


Null は「空っぽ」
Reference は「参照」
Exception は「例外(エラー)」

という意味です。つまり、NullReferenceException とは、
「どこも参照してないよ!」、「ソコを見にいけ!って言うけど、ソコってどこだよ!!」
という感じで、Unityが困っている場合に起こるエラーです。

Unityでは、様々な機能が呼び出し、呼び出されの関係で動いていますが、
ゲームシーンの再生中に、これらの機能を何処から呼び出すのか? の「何処から」が欠落していると NullReferenceException が発生します。
(厳密には他にもいろいろありますけど、ほとんどの場合コレです)

また、NullReferenceException はシーン再生中にしか起こりません。(実行時例外という)
買ってきた本のプログラムをせっせと写して、スペルミスを直してコンパイルが通るようになって、やっとこさ再生ボタンが押せるようになったとき、いざ再生したらコンソールに大量のNullReferenceException が現れて、初学者の心をヘシ折ってきます。

NullReferenceExceptionが起きる例


一番の原因はGameObjectが見つけられていないときですね。
例えば下図は、「Player」という名前のゲームオブジェクトを検索し、検索結果を変数に取得して「変数.name」でオブジェクト名をログに出すコードです。

このスクリプトを実行したとき、シーン内に「Player」という名前のGameObjectが存在しなかったとき、変数gameObjはNullとなります。
名前を表示したくても、対象がNull(空っぽ)では無理 → 8行目で NullReferenceException が発生となります。
参照型の変数がNullのまま使うと起こるエラーということです。

Exception発生箇所の特定


実行時例外が発生したら、とにかく発生箇所の特定が必要で、そのヒントはエラーメッセージに書いてあります。

上記のエラーの末尾に、「at Assets/NewBehaviourScript.cs:8」と書かれています。
これは、NewBehaviourScriptスクリプトの8行目でこのエラーが起きているということなので、当該スクリプトを開いて確認します。
その際、このエラーメッセージをダブルクリックすることで、エディターの該当する箇所を直接開くことができます。
エラー発生箇所が特定出来たら、検索対象のスペルミスや、処理の順番などを確認してみましょう。

よく起こる似たようなエラー


よく起こる似たようなエラーに UnassignedReferenceException があります。
例えば下図のようにpublic変数を宣言すると、

インスペクター上に表示されるため、Findメソッドで取得する代わりに、D&Dなどで紐づけることができます。

このとき、上図のように紐づけがNoneのままになっていて、かつスクリプトでも取得しないまま変数を使用してしまうと、

UnassignedReferenceException が発生します。
「紐づけできてないよ!」というエラーなので、インスペクターを確認して、紐づけ漏れがないか確認してみましょう。

以上です。

  • このエントリーをはてなブックマークに追加

PAGE TOP