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


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

以上です。

最近よく読まれている記事

【Unityのプログラミング力向上】C# 練習問題 4
【Unityのプログラミング力向上】C# 練習問題 3

記事一覧にもどる

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

PAGE TOP