mohumohu studio みずきの技術&読書ブログ&無料ゲーム

mohumohu studio

           

みずきの技術&読書ブログ&無料ゲーム

プロフィール画像

【C# / Unity】NullReferenceExceptionとは?原因と対処法を初心者向けに徹底解説

C# や Unity で開発をしていると、ほぼ必ず一度は遭遇するエラーがあります。
それが NullReferenceException です。

「昨日まで動いていたのに、なぜか急にエラーが出る」
「エラーメッセージの意味が分からない」
「どこを直せばいいのか見当もつかない」

私自身も、Unity を触り始めた頃はこのエラーに何度も悩まされました。
しかし、NullReferenceException仕組みさえ理解すれば怖くありません

この記事では、

  • NullReferenceException とは何か
  • なぜ発生するのか
  • よくある原因と対処法
  • エラーを未然に防ぐ考え方

を、Unity 初心者にも分かるように解説します。


目次

  1. NullReferenceExceptionとは何か?
  2. よくある発生原因
    1. GetComponent で取得できていない
    2. Inspector で設定し忘れている
    3. new していないクラスを使っている
    4. 配列・リストの中身が null
  3. エラーログの正しい読み方
  4. デバッグの基本テクニック
    1. Debug.Log で状態を確認する
    2. if 文で安全にガードする
  5. NullReferenceException を防ぐ設計の考え方
    1. Awake / Start で必ず初期化する
    2. SerializeField を活用する
    3. 「この変数は null になり得るか?」を考える
  6. まとめ

NullReferenceExceptionとは何か?

NullReferenceException とは、

null(何も参照していない状態)のオブジェクトにアクセスしようとしたときに発生するエラー

です。

例えば、次のコードを見てください。


GameObject player = null;
player.SetActive(true);


このコードでは playernull のままなのに、
SetActive() を呼び出そうとしているため、NullReferenceException が発生します。

つまり、

  • 「存在しないもの」
  • 「まだ用意されていないもの」

を使おうとした結果、エラーになるということです。


よくある発生原因

① GetComponent で取得できていない


Enemy enemy = GetComponent<Enemy>();
enemy.Damage(10);
  • Enemy コンポーネントが付いていない
  • 別の GameObject に付いている

この場合、enemynull になります。

👉 Unity 初心者が最もハマりやすい原因です。


② Inspector で設定し忘れている


public GameObject effect;

void Start()
{
    effect.SetActive(true);
}

Inspector で effect にオブジェクトを設定していないと、
effectnull のままになります。

  • Prefab では設定したが、シーン側では未設定
  • 変数を追加したあと設定を忘れた

こうしたケースも非常に多いです。


③ new していないクラスを使っている


PlayerStatus status;

void Start()
{
    Debug.Log(status.hp);
}

status は宣言されているだけで、インスタンス化されていません


status = new PlayerStatus();

を忘れると、確実に NullReferenceException が発生します。


④ 配列・リストの中身が null


List<Enemy> enemies = new List<Enemy>();

void Update()
{
    enemies[0].Attack();
}
  • 要素を追加していない
  • 途中で削除された

といった理由で、中身が null になることがあります。


エラーログの正しい読み方

Unity の Console に表示されるエラーには、必ずヒントがあります

例:


NullReferenceException: Object reference not set to an instance of an object
Player.Attack() (at Assets/Scripts/Player.cs:42)

注目すべきポイントは、

  • Player.cs
  • 42行目

です。

👉 まずはその行にある「null になりそうな変数」を確認しましょう。


デバッグの基本テクニック

Debug.Log で状態を確認する


if (enemy == null)
{
    Debug.Log("enemy が null です");
}

どこで null になっているのかを
ログで可視化すると、原因特定が一気に楽になります。


if 文で安全にガードする


if (enemy != null)
{
    enemy.Damage(10);
}

これは一時的な対処として有効です。

ただし、

  • なぜ null なのか?
  • 本来 null であってよいのか?

は必ず考えるようにしましょう。


NullReferenceException を防ぐ設計の考え方

① Awake / Start で必ず初期化する


void Awake()
{
    enemy = GetComponent<Enemy>();
}

  • 「使う前に代入されているか」
  • 「初期化のタイミングは正しいか」

を意識するだけで、エラーは激減します。


② SerializeField を活用する


[SerializeField]
private GameObject effect;

  • public にしなくてよい
  • Inspector から設定できる
  • 設計がきれいになる

👉 Unity では非常におすすめの書き方です。


③ 「この変数は null になり得るか?」を考える

経験を積んだ開発者ほど、

この変数、null になる可能性あるな

という視点でコードを書いています。

エラーが出たときは「運が悪かった」ではなく、
設計の見直しチャンスと考えるのが上達への近道です。


まとめ

  • NullReferenceException は C#・Unity 開発者の登竜門
  • 原因の多くは
    • GetComponent の失敗
    • Inspector の設定忘れ
    • 初期化漏れ
  • エラーログの「ファイル名・行番号」を必ず確認する
  • null を防ぐ設計を意識すると、開発効率が大きく向上する
2026-01-05

0件のコメント

コメントはまだありません。最初の一人になりましょう!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です