【Unity】NullReferenceExceptionを発生させてVisual Studioで解決する方法
Unity開発において、NullReferenceExceptionはよく遭遇するエラーの一つです。このチュートリアルでは、実際にエラーを発生させ、そのエラーをVisual Studioのデバッガを使って解決する方法を、初心者向けにステップバイステップで説明します。
目次
- プロジェクトの準備
- エラーを発生させるコードの作成
- エラーの確認
- Visual Studioでのデバッグ環境の設定
- ブレークポイントの設定とデバッグの開始
- エラーの原因の特定
- エラーの修正
- 修正後の確認
- まとめ
1. プロジェクトの準備
1.1 新しいUnityプロジェクトの作成
- Unity Hubを開き、「新規作成」をクリックします。
- テンプレートとして「3D Core」(またはお好みのテンプレート)を選択します。
- プロジェクト名を「NullReferenceTutorial」とします。
- 「作成」をクリックしてプロジェクトを生成します。
1.2 シーンのセットアップ
- Hierarchyウィンドウで、「+」ボタンをクリックし、「3D Object」から「Cube」を選択してキューブを作成します。
- キューブの名前を「Player」に変更します。
2. エラーを発生させるコードの作成
2.1 新しいスクリプトの作成
- Projectウィンドウで、Assetsフォルダ内を右クリックし、「Create」 > 「C# Script」を選択します。
- スクリプトの名前を「NullReferenceExample」に変更します。
2.2 スクリプトにエラーを含むコードを記述
- 「NullReferenceExample」スクリプトをダブルクリックしてVisual Studioで開きます。
- 以下のコードを入力します。
using UnityEngine;
public class NullReferenceExample : MonoBehaviour
{
GameObject targetObject;
void Start()
{
// targetObjectにアクセスして色を赤に変更
targetObject.GetComponent<Renderer>().material.color = Color.red;
}
}
注:
targetObject
に何も割り当てていないため、このコードはNullReferenceException
を引き起こします。
2.3 スクリプトをゲームオブジェクトにアタッチ
- Hierarchyウィンドウで、右クリックし、「Create Empty」を選択して空のゲームオブジェクトを作成します。
- 空のゲームオブジェクトの名前を「GameManager」に変更します。
- 「GameManager」に「NullReferenceExample」スクリプトをドラッグ&ドロップしてアタッチします。
3. エラーの確認
- Unityエディタで再生ボタンをクリックしてゲームを実行します。
- Consoleウィンドウに以下のエラーメッセージが表示されます。
NullReferenceException: Object reference not set to an instance of an object
NullReferenceExample.Start() (at Assets/NullReferenceExample.cs:9)
解説:
targetObject
がnull
であるため、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の連携設定
- Unityエディタのメニューから、「Edit」 > 「Preferences」を選択します。
- 左側のリストから「External Tools」を選択します。
- External Script Editorが「Visual Studio」になっていることを確認します。
4.2 デバッグの準備
- Visual Studioでスクリプトが開いている状態で、メニューから「デバッグ」 > 「Unityにアタッチ」を選択します。
- これにより、Visual StudioとUnityが連携し、デバッグが可能な状態になります。
5. ブレークポイントの設定とデバッグの開始
5.1 ブレークポイントの設定
- 「NullReferenceExample」スクリプトの
Start()
メソッド内、エラーが発生する行(targetObject.GetComponent<Renderer>().material.color = Color.red;
)の左側の余白をクリックします。
- 赤い丸(ブレークポイント)が表示されます。
5.2 デバッグの開始
- Unityエディタに戻り、再生ボタンをクリックしてゲームを実行します。
- ブレークポイントが設定された行に到達すると、Unityの実行が一時停止し、Visual Studioがアクティブになります。
6. エラーの原因の特定
6.1 変数の値を確認
- Visual Studioで、「自動」ウィンドウを開きます(デバッグ中に自動的に表示されます)。
targetObject
の値を確認します。
null
と表示されているはずです。
6.2 呼び出し履歴の確認
- 「呼び出し履歴」ウィンドウを開き、エラーが発生した関数の呼び出し順序を確認します。
6.3 問題の分析
targetObject
がnull
であるため、GetComponent<Renderer>()
を呼び出せず、NullReferenceException
が発生しています。
7. エラーの修正
7.1 修正方法1:インスペクターでオブジェクトを割り当てる
条件として、宣言を次のようにpubulicにした時です
public GameObject targetObject;
- Unityエディタで、「GameManager」オブジェクトを選択します。
- Inspectorウィンドウで、「Null Reference Example (Script)」コンポーネントを確認します。
- 「Target Object」フィールドが「None (Game Object)」になっています。
- Hierarchyウィンドウから「Player」オブジェクトをこのフィールドにドラッグ&ドロップします。
7.2 修正方法2:コードでオブジェクトを取得する
- もしコード内で
targetObject
を設定したい場合、以下のように修正します。 - プライベートフィールドで宣言した時、(GameObject targetObject;としてpublicをつけないとき)は、特にこの方法を取ります
void Start()
{
targetObject = GameObject.Find("Player");
targetObject.GetComponent<Renderer>().material.color = Color.red;
}
8. 修正後の確認
- Visual Studioでデバッグを停止します。
- メニューから「デバッグ」 > 「デバッグの停止」を選択します。
- Unityエディタで再生ボタンをクリックしてゲームを実行します。
- エラーが発生せず、Playerオブジェクトの色が赤色に変わっていることを確認します。
9. まとめ
このチュートリアルでは、NullReferenceException
を意図的に発生させ、それをVisual Studioのデバッガを使って解決する方法を学びました。
- エラーの再現:
null
の変数にアクセスしてエラーを発生。 - デバッグ環境の設定: UnityとVisual Studioを連携。
- ブレークポイントの使用: コードの特定の行で実行を一時停止。
- 変数の確認:
targetObject
がnull
であることを確認。 - エラーの修正: インスペクターでオブジェクトを割り当て、またはコードで取得。
デバッグはプログラミングの重要なスキルです。 エラーが発生したときは、デバッガを活用して原因を特定し、適切に対処しましょう。
追加のポイント
- デバッガの活用: ブレークポイント以外にも、ステップ実行やウォッチウィンドウなどの機能があります。
- エラーメッセージの理解: エラーメッセージには問題解決のヒントが含まれています。
- ドキュメントの参照: 不明な点があれば、UnityやC#の公式ドキュメントを参照しましょう。
これでチュートリアルは終了です。お疲れさまでした!学習が進むにつれて、より複雑なデバッグもできるようになりますので、引き続き頑張ってください。
ディスカッション
コメント一覧
まだ、コメントがありません