sh1’s diary

プログラミング、読んだ本、資格試験、ゲームとか私を記録するところ

Unity スクリプトコードを Visual Studio でステップ実行・ブレークポイントを使ってデバッグをする

f:id:shikaku_sh:20200910152454p:plain

Unity のコード書いたあとに、Visual Studio(コードエディター)を使って、コードのステップ実行やブレークポイントを設置して気になる箇所を確認するといった、典型的なデバッグ作業の(そもそもの)やり方に関するメモです。

環境構築

Visual Studio 2017 以前は、「Visual Studio Tools for Unity」を別途インストールする、設定をする必要があったりして、ややもすれば混乱しがちだったように思います。

現在の Visual Studio 2019 だと、Unity Hub のように Visual Studio Installer がインストール済の構成やバージョンを管理してくれるようになったので、設定の面での混乱が小さくなりました。おそらく、デフォルトで「Visual Studio Tools for Unity」がインストールされているかと思います。

Visual Studio Installer を開いて、Unity で使用している(する) Visual Studio の「インストールの詳細」に Unity によるゲーム開発、Visual Studio Tools for Unity が含まれているかどうかをチェックします。

f:id:shikaku_sh:20201002143458p:plain:w600

とりあえず、これで Visual Studio 側の環境設定は完了です。Unity で使用するコードエディターを確認するときは、Unity > Preferences > External Tools を開いて、External Script Editor を設定・確認してみてください。

f:id:shikaku_sh:20201002143523p:plain:w600

デバッグ(アタッチ)のやり方

テストとしてシンプルな方法:

  1. Unity Hub からデバッグをするプロジェクトを Unity で開く
  2. 問題のコードを選択して、Visual Studio を起動する
  3. Visual Studio のメニューから デバッグ > Unity デバッガ―のアタッチ を選択する
  4. 起動しているプロジェクトを選択する
  5. Visual Studio でコードにブレークポイントを設置する
  6. Unity で「実行」ボタンを押下する
  7. ブレークポイントで停止するかどうかを確認する

f:id:shikaku_sh:20201002143633p:plain
メニューから選択します
f:id:shikaku_sh:20201002143647p:plain:w400
プロジェクトを選択します

こんな感じで、最初は正しくデバッグできるかどうかをチェックします。

f:id:shikaku_sh:20201002143746p:plain
ブレークポイントで停止を確認する

デバッグの便利な設定・応用

f:id:shikaku_sh:20201002150255p:plain

Visual Studio のアタッチ設定を切り替えます。「Unity にアタッチして再生」にすると、Visual Studio 側から Unity の再生ボタンを押下して、プログラムのデバッグ開始(デバッグ再生)を指示することができるようになります。

f:id:shikaku_sh:20201002143929g:plain
Visual Studio から開始と停止ができるようになる

Visual Studio に慣れてる人だと、F5デバッグを開始したくなるんで、もう必須だと思います。

Unity からも「Unity でコーディングするときに Visual Studio ツールを最適化するためのヒント」の記事で「“アタッチして再生”を使用してデバッグをスピードアップする」より、紹介されています。オススメ。

DebuggerDisplay 属性

デバッグ機能を使えるようになると「DebuggerDisplay 属性」を設定することで、よりデバッグがやりやすくなると思います。

通常だと、名前空間.クラス名 が表示されている部分を DebuggerDisplay のテキストに置き換えるデバッグ専用の機能です。

DebuggerDisplay の記述は、ちょっと癖があって string で扱う文字列補完をすべて扱うことができません。また、コンパイル時点までは、テキストとしてしか見ていないので、途中で変数名を変更してもエラーが表示されるわけでもありません。

なので、オススメなやりかたはこうなります:

[DebuggerDisplay("{DebuggerText}")]
public class Sample
{
    public int A { get; } = 1;
    public double B { get; } = 12.345;
    public string C { get; } = null;

    public string DebuggerText => $"A = {A}, B = {B:00.00}, C = {C ?? "null"}";
}

f:id:shikaku_sh:20201002144123p:plain:w550

こんな感じで、デバッグのウォッチ情報から一覧が取得できます。これが強力になるシーンは、コレクション型のデータです。ウォッチの内容を潜っていかなくても、一覧として情報を確認することができるようになります。

f:id:shikaku_sh:20201002144139p:plain:w550

デバッグとテスト

このデバッグのやり方はとても便利なんですが人力感が強く、テストとはまた別の強みがあります。なので、Unit テスト、コードメトリクス、バグを防ぐ・修正する手法は、色々なアプローチを修めておくとよいと思います。

参考