【初学者必見】Unityの実行時エラーの9割はNullReferenceExceptionだよね
▶
【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
Unityの実行時エラーの9割はNullReferenceExceptionだよね
9割は言い過ぎかもしれませんが、体感的にはそれぐらいです。
実際、「なんか動きません!」って相談のほとんどが NullReferenceException です。
特に本とか買ってきて勉強を始めたUnity初学者がやりがちですね。
書籍ってその通りにやれば上手くいくんですけど、失敗した時の対処法はあまり書かれていません。
今回はこのエラーがどういうものか?何故起きて、どうすれば解決できるのか紹介したいと思います。
※使用しているUnityのバージョンは5.5.2f1です。
[Unity_317×90]
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】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
ゲーム制作関連のオススメ連載リンク
とっても手軽なゲーム制作体験!
Unityゲーム開発基礎
実際のリリースゲームを題材にしたハンズオンゲーム制作連載
実践unityゲーム開発