【C# / Unity】NullReferenceExceptionとは?原因と対処法を初心者向けに徹底解説
C# や Unity で開発をしていると、ほぼ必ず一度は遭遇するエラーがあります。
それが NullReferenceException です。
「昨日まで動いていたのに、なぜか急にエラーが出る」
「エラーメッセージの意味が分からない」
「どこを直せばいいのか見当もつかない」
私自身も、Unity を触り始めた頃はこのエラーに何度も悩まされました。
しかし、NullReferenceException は仕組みさえ理解すれば怖くありません。
この記事では、
- NullReferenceException とは何か
- なぜ発生するのか
- よくある原因と対処法
- エラーを未然に防ぐ考え方
を、Unity 初心者にも分かるように解説します。
目次
NullReferenceExceptionとは何か?
NullReferenceException とは、
null(何も参照していない状態)のオブジェクトにアクセスしようとしたときに発生するエラー
です。
例えば、次のコードを見てください。
GameObject player = null;
player.SetActive(true);
このコードでは player が null のままなのに、SetActive() を呼び出そうとしているため、NullReferenceException が発生します。
つまり、
- 「存在しないもの」
- 「まだ用意されていないもの」
を使おうとした結果、エラーになるということです。
よくある発生原因
① GetComponent で取得できていない
Enemy enemy = GetComponent<Enemy>();
enemy.Damage(10);
Enemyコンポーネントが付いていない- 別の GameObject に付いている
この場合、enemy は null になります。
👉 Unity 初心者が最もハマりやすい原因です。
② Inspector で設定し忘れている
public GameObject effect;
void Start()
{
effect.SetActive(true);
}
Inspector で effect にオブジェクトを設定していないと、effect は null のままになります。
- 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 を防ぐ設計を意識すると、開発効率が大きく向上する
0件のコメント
コメントはまだありません。最初の一人になりましょう!