【Unity、Visual Studio】デバッグのやり方について

どうも!

Unityでゲームを作っていたら、なぜか動かないとか、思った通りに動作しない…ほんとあるあるですよね。ぼく自身、そもそもどこにバグが発生しているのか、探し出せない人間でした。

そこで今回は、UnityとVisual Studioを使ったバグの見つけ方を、自分の備忘録もかねてまとめていきたいと思います。

【Unity、Visual Studio】デバッグのやり方について

今回紹介するデバッグ手順は以下の通りです。

  1. バグが発生している状況を再現する
  2. バグの発生に関係するコードを特定する
  3. Visual Studioで問題のスクリプトを開き、バグを起こしているコード付近の内容を理解する
  4. バグ付近にブレークポイントを設置し、Unityにアタッチしてバグがどこで発生しているか確認する

デバッグのやり方の詳しい解説

手順だけだと分かりにくいと思うので、今回はサンプルを用いてデバッグの手順を詳しく解説しようと思います。状況は以下の通りです。

状況

ポーカーのオンライン対戦ゲームの対人戦を開始するのに必要なボタンが表示されない状況

 

正常な画面

正常に表示される場合は、以下のようにMultiplayerと表示されます。

 

 

バグが発生している画面

Multiplayerというボタンが表示されていない状態。

 

バグが発生した状況を再現する

ポイント
バグがどのタイミングで発生しているのか、その状況を再現するところから始めます。バグが起こる状況、バグの発生に関わるUIなどを特定します。

今回のバグについては、「Unityの起動時に、Multiplayerボタンを表示させるか表示させないかのプログラムがうまく機能していないこと」が考えられます。

Multiplayerボタンの出現に関係するスクリプトや記述を見つけられれば、バグの手掛かりをつかめます。

バグの発生に関わっているコードを特定する

ポイント

バグが発生する状況が理解出来たら、バグに関わるコードを特定します。

 

特定方法はスクリプトファイルをひとつひとつ探すのもいいですし、ファイルが大量にあるならサクラエディタを使ってもいいと思います。

今回はUnityを使ってゲームを作成しているので、現在バグで消えてしまっているMultiplayer用のボタンを、シーン上、もしくはヒエラルキーウィンドウ上から探します。

結局、Multiplayerボタンの名前は「ButtonGoMultiplayer」だということがヒエラルキー上、もしくはインスペクター上から分かりました。

今度はこの「ButtonGoMultiplayer」が記述されているスクリプトを探していきます。

今回はサクラエディタのGrep(グレップ)機能を使うことにします。Grep機能は、特定の記述があるスクリプトファイルを探し出してくれる機能です。使い方は以下の通りです。

  • 手順1
    サクラエディタを開きCtrl+Gを押す

    サクラエディタを起動したら、サクラエディタをアクティブにした状態で、「Ctrl+G」を押します。すると以下のような画面が表示されます。

  • 手順2
    条件とフォルダを選択して、検索をクリックする

    検索に必要な情報を入力します。今回であれば条件の部分に「ButtonGoMultiplayer」と入力し、フォルダはバグを引き起こしているスクリプトがあると思われるフォルダを選択。入力出来たら検索ボタンをクリックします。

  • 手順3
    検索結果をもとにスクリプトのファイル名や場所を特定する

    しばらく待つと、検索結果が表示されます。スクリプトがいくつか出てくる場合もありますので、その場合はすべて確認していきます。

    今回は1つのスクリプトファイルしか出てこなかったので、そのスクリプトを見れば「ButtonGoMultiplayer」の出現を制御する記述が書かれている可能性があります。

MEMO

バグを引き起こしているスクリプトの場所がわかっているなら、サクラエディタを使う必要はありません。

スクリプトファイルが大量にある場合や、チームでの開発でスクリプトファイルがどこにあるか把握していない場合は、サクラエディタを使う方が便利です。

Visual Studioで問題のスクリプトを開き、問題のコードの内容を理解する

ポイント
バグが発生している可能性が高いスクリプトファイルをVisual Studioで開きます。そして該当部分のコードの内容、構造を理解します。

サクラエディタを使った結果、「ButtonGoMultiplayer」が記述されているスクリプトはひとつだけで、スクリプトのファイル名は「BBMainMenuController」だと分かりました。

ここから以下の手順で問題のコードの内容を理解していきます。

  • 手順1
    対象のスクリプトファイルをVisual Studioで開く

    バグが発生している可能性の高いスクリプトファイルを開きます。今回は「BBMainMenuController」というスクリプトファイルです。

  • 手順2
    スクリプトファイル内を検索して、ButtonGoMultiplayerの記述がある場所へ移動する

    スクリプトは長い場合もあるので、スクリプト内検索「Ctrl+F」を押し、スクリプト内検索をします。

    検索窓に調べたい単語「ButtonGoMultiplayer」を入力します。そうすると該当の場所まですばやく到達できます。

  • 手順3
    コードの内容や構造を理解する

    コードがどのような内容になっているのか、あるいはどのような構造になっているのか確認します。例えば今回のコードは以下の通りです。

    コード
    #if !USE_PHOTON
    GameObject buttMultiplayer = GameObject.Find("ButtonGoMultiplayer");
    if(buttMultiplayer) {
    Destroy(buttMultiplayer);
    }
    #endif

    このコードの大まかな意味は「もしUSE_PHOTONという記述がなければ、『ButtonGoMultiplayer』というボタンを消去する」といった感じです。

    つまりUSE_PHOTONという記述をどこかに入れることによって、バグが治りそうな気がします。

MEMO

スクリプトを見ても全く意味が分からないことがあると思います。そういったときは簡易的ですが、下の2つの方法で調べていきます。

 

わからないクラスやメソッドを調べる

「Ctrl+対象のクラス名、メソッド名をクリック」することで、クラスやメソッドが定義されている場所に飛ぶことができます。

 

わからない指示語を調べる

「対象の指示語にマウスカーソルを合わせる」とその指示後の説明が出てきます。それでわからなければ、Google検索して意味を確認します。

 

問題のコードをVisual Studioでデバッグする

ポイント
ブレークポイントを設置して、Visual Studioで実際にデバッグしていきます。ブレークポイントをうまく使うことで、バグがどこで起きているのか、把握することができます。
  • 手順1
    ブレークポイントの設置

    まずブレークポイントを設置します。簡単に説明すると「Unityでゲームを動かしたときに、ポイント部分のコードが読み込まれるとゲームが停止される」というポイントです。

    ブレークポイントの設置は、下の図の灰色の部分をクリックするだけでOKです。そうすると赤いポイントが表示されます。ちなみにいくつもブレークポイントは設置することができます。

  • 手順2
    Visual Studio上部の「Unityにアタッチ」ボタンを押す

    ブレークポイントが設定出来たら、今度はUnityにアタッチします。するとVisual Studioの画面がデバックの実行中という表示にかわります。

  • 手順3
    Unityのゲーム再生ボタンを押して、ゲームを動かす

    ここまで出来たら、Unityの再生ボタンをおして、ゲーム実行します。

    すると先ほど設定したブレークポイントのところでゲームがとまりました。以下の画像で左側にやじるしが出ていますが、今まさにこの部分でプログラムがとまっていることを表しています。

    MEMO
    デバッグ中にF11キーを押すことで、デバッグを最小単位の1行程ずつ進めることができます。

    さきほど言ったように、このままプログラムが進んでしまっているために、ButtonGoMultiplayerボタンが消えてしまっていることがわかりました。

    USE_PHOTONという記述をあらかじめシステム上に入力しておくことで、Multiplayerボタンが無事に表示されることが分かりました。

    MEMO
    ブレークポイントまでプログラムが流れている場合、バグはそれ以降にあります。逆にプログラムがブレークポイントまで流れてこない場合は、バグがブレークポイントより前にある可能性があります。

まとめ

ということで、UnityとVisual Studioを使ったデバッグの方法についてまとめました。これができるようになると、どこにバグの原因があるのかがわかるようになります。

そしてどのように直したらいいのかという部分も理解できるようになっていくかと思います!