【Unity】NullReferenceExceptionを発生させてVisual Studioで解決する方法

Unity開発において、NullReferenceExceptionはよく遭遇するエラーの一つです。このチュートリアルでは、実際にエラーを発生させ、そのエラーをVisual Studioのデバッガを使って解決する方法を、初心者向けにステップバイステップで説明します。


目次

  1. プロジェクトの準備
  2. エラーを発生させるコードの作成
  3. エラーの確認
  4. Visual Studioでのデバッグ環境の設定
  5. ブレークポイントの設定とデバッグの開始
  6. エラーの原因の特定
  7. エラーの修正
  8. 修正後の確認
  9. まとめ

1. プロジェクトの準備

1.1 新しいUnityプロジェクトの作成

  1. Unity Hubを開き、「新規作成」をクリックします。
  2. テンプレートとして「3D Core」(またはお好みのテンプレート)を選択します。
  3. プロジェクト名を「NullReferenceTutorial」とします。
  4. 「作成」をクリックしてプロジェクトを生成します。

1.2 シーンのセットアップ

  1. Hierarchyウィンドウで、「+」ボタンをクリックし、「3D Object」から「Cube」を選択してキューブを作成します。
  2. キューブの名前を「Player」に変更します。

2. エラーを発生させるコードの作成

2.1 新しいスクリプトの作成

  1. Projectウィンドウで、Assetsフォルダ内を右クリックし、「Create」 > 「C# Script」を選択します。
  2. スクリプトの名前を「NullReferenceExample」に変更します。

2.2 スクリプトにエラーを含むコードを記述

  1. 「NullReferenceExample」スクリプトをダブルクリックしてVisual Studioで開きます。
  2. 以下のコードを入力します。
   using UnityEngine;

   public class NullReferenceExample : MonoBehaviour
   {
       GameObject targetObject;

       void Start()
       {
           // targetObjectにアクセスして色を赤に変更
           targetObject.GetComponent<Renderer>().material.color = Color.red;
       }
   }

注: targetObjectに何も割り当てていないため、このコードはNullReferenceExceptionを引き起こします。

2.3 スクリプトをゲームオブジェクトにアタッチ

  1. Hierarchyウィンドウで、右クリックし、「Create Empty」を選択して空のゲームオブジェクトを作成します。
  2. 空のゲームオブジェクトの名前を「GameManager」に変更します。
  3. 「GameManager」に「NullReferenceExample」スクリプトをドラッグ&ドロップしてアタッチします。

3. エラーの確認

  1. Unityエディタ再生ボタンをクリックしてゲームを実行します。
  2. Consoleウィンドウに以下のエラーメッセージが表示されます。
   NullReferenceException: Object reference not set to an instance of an object
   NullReferenceExample.Start() (at Assets/NullReferenceExample.cs:9)

解説: targetObjectnullであるため、GetComponent<Renderer>()を呼び出そうとしてエラーが発生しています。

次のようなエラーメッセージが表示されます
インスペクターでアウトレット接続ができる可能性があるため、メッセージが変わります

UnassignedReferenceException: The variable gameObject of NullSample has not been assigned.
You probably need to assign the gameObject variable of the NullSample script in the inspector.

UnassignedReferenceException: NullSampleのgameObject変数が割り当てられていません。 おそらく、インスペクターでNullSampleスクリプトのgameObject変数を割り当てる必要があります。


4. Visual Studioでのデバッグ環境の設定

4.1 UnityとVisual Studioの連携設定

  1. Unityエディタのメニューから、「Edit」 > 「Preferences」を選択します。
  2. 左側のリストから「External Tools」を選択します。
  3. External Script Editor「Visual Studio」になっていることを確認します。

4.2 デバッグの準備

  1. Visual Studioでスクリプトが開いている状態で、メニューから「デバッグ」 > 「Unityにアタッチ」を選択します。
  • これにより、Visual StudioとUnityが連携し、デバッグが可能な状態になります。

5. ブレークポイントの設定とデバッグの開始

5.1 ブレークポイントの設定

  1. 「NullReferenceExample」スクリプトのStart()メソッド内、エラーが発生する行(targetObject.GetComponent<Renderer>().material.color = Color.red;)の左側の余白をクリックします。
  • 赤い丸(ブレークポイント)が表示されます。

5.2 デバッグの開始

  1. Unityエディタに戻り、再生ボタンをクリックしてゲームを実行します。
  2. ブレークポイントが設定された行に到達すると、Unityの実行が一時停止し、Visual Studioがアクティブになります。

6. エラーの原因の特定

6.1 変数の値を確認

  1. Visual Studioで、「自動」ウィンドウを開きます(デバッグ中に自動的に表示されます)。
  2. targetObjectの値を確認します。
  • nullと表示されているはずです。

6.2 呼び出し履歴の確認

  1. 「呼び出し履歴」ウィンドウを開き、エラーが発生した関数の呼び出し順序を確認します。

6.3 問題の分析

  • targetObjectnullであるため、GetComponent<Renderer>()を呼び出せず、NullReferenceExceptionが発生しています。

7. エラーの修正

7.1 修正方法1:インスペクターでオブジェクトを割り当てる

条件として、宣言を次のようにpubulicにした時です

public GameObject targetObject;
  1. Unityエディタで、「GameManager」オブジェクトを選択します。
  2. Inspectorウィンドウで、「Null Reference Example (Script)」コンポーネントを確認します。
  3. 「Target Object」フィールドが「None (Game Object)」になっています。
  4. Hierarchyウィンドウから「Player」オブジェクトをこのフィールドにドラッグ&ドロップします。

7.2 修正方法2:コードでオブジェクトを取得する

  • もしコード内でtargetObjectを設定したい場合、以下のように修正します。
  • プライベートフィールドで宣言した時、(GameObject targetObject;としてpublicをつけないとき)は、特にこの方法を取ります
   void Start()
   {
       targetObject = GameObject.Find("Player");
       targetObject.GetComponent<Renderer>().material.color = Color.red;
   }

8. 修正後の確認

  1. Visual Studioでデバッグを停止します。
  • メニューから「デバッグ」 > 「デバッグの停止」を選択します。
  1. Unityエディタ再生ボタンをクリックしてゲームを実行します。
  2. エラーが発生せず、Playerオブジェクトの色が赤色に変わっていることを確認します。

9. まとめ

このチュートリアルでは、NullReferenceExceptionを意図的に発生させ、それをVisual Studioのデバッガを使って解決する方法を学びました。

  • エラーの再現: nullの変数にアクセスしてエラーを発生。
  • デバッグ環境の設定: UnityとVisual Studioを連携。
  • ブレークポイントの使用: コードの特定の行で実行を一時停止。
  • 変数の確認: targetObjectnullであることを確認。
  • エラーの修正: インスペクターでオブジェクトを割り当て、またはコードで取得。

デバッグはプログラミングの重要なスキルです。 エラーが発生したときは、デバッガを活用して原因を特定し、適切に対処しましょう。


追加のポイント

  • デバッガの活用: ブレークポイント以外にも、ステップ実行やウォッチウィンドウなどの機能があります。
  • エラーメッセージの理解: エラーメッセージには問題解決のヒントが含まれています。
  • ドキュメントの参照: 不明な点があれば、UnityやC#の公式ドキュメントを参照しましょう。

これでチュートリアルは終了です。お疲れさまでした!学習が進むにつれて、より複雑なデバッグもできるようになりますので、引き続き頑張ってください。

Unity

Posted by hidepon