気を付けておかないと頻繁に目にすることになってしまう「NullReferenceException」について。

スクリーンショット (614).png

Null Reference Exception とは何か

Unity のマニュアルの説明があります。
どのオブジェクトにも参照を持たない参照変数にアクセスしようとすると、NullReferenceException が起こります。参照変数がオブジェクトを参照していない場合、それは null として扱われるでしょう。実行して変数が null のとき,『NullReferenceException』を出すことによってオブジェクトにアクセスしようとしていることを教えてくれます。
と、いうことです。


たとえば、Enemy のスクリプト内で Player オブジェクトの位置を参照する必要があるのに、そもそも Player オブジェクトが取得されていなかったり、あるいは Player オブジェクトが破壊されてシーンから消えてしまったときなどに、このエラー(例外)が表示されます。

対処方法

対処方法も Unity マニュアルに記載されているとおりです。Null チェックTry/Catch ブロック を使う方法の2種類が示されていますが、まずは対象が null になっていないことをしっかりチェックするのが大切だと思います。

対処方法の例

さきほどの例で、「Enemy が Player を追いかける処理が常時実行されているときに、Player オブジェクトが破壊される」と、 NullReferenceException が発生します。

以下は実際のコードですが、NullReferenceException の発生を確認した後、次の2点を修正したものです。
  • while 文で「常時実行する」という処理について、「Playerオブジェクトが存在するならば実行する」というように条件を修正した(51-52行目)
  • その後、Player オブジェクトが破壊された後で生まれてくる Enemy では、Start メソッド内で NullReferenceException が発生することが分かったため、Start メソッドの処理時点で Player が存在しなければスクリプト自体を無効にする処理を追加した(23-27行目)


このように、エラーや例外についてはテストプレイなどを行うことで発見し、その都度しっかり潰していけばよいのだと思います。


今回は以上です。感想・質問・要望等、お待ちしております (´▽`)
(この記事の使用環境: Unity2018.1.0f2 (.NET4.x Equivalent)、Windows10)
follow us in feedly