どうも!
Unityでゲームを作っていたら、なぜか動かないとか、思った通りに動作しない…ほんとあるあるですよね。ぼく自身、そもそもどこにバグが発生しているのか、探し出せない人間でした。
そこで今回は、UnityとVisual Studioを使ったバグの見つけ方を、自分の備忘録もかねてまとめていきたいと思います。
【Unity、Visual Studio】デバッグのやり方について
今回紹介するデバッグ手順は以下の通りです。
- バグが発生している状況を再現する
- バグの発生に関係するコードを特定する
- Visual Studioで問題のスクリプトを開き、バグを起こしているコード付近の内容を理解する
- バグ付近にブレークポイントを設置し、Unityにアタッチしてバグがどこで発生しているか確認する
デバッグのやり方の詳しい解説
手順だけだと分かりにくいと思うので、今回はサンプルを用いてデバッグの手順を詳しく解説しようと思います。状況は以下の通りです。
状況
ポーカーのオンライン対戦ゲームの対人戦を開始するのに必要なボタンが表示されない状況
正常な画面
正常に表示される場合は、以下のようにMultiplayerと表示されます。
バグが発生している画面
Multiplayerというボタンが表示されていない状態。
バグが発生した状況を再現する
今回のバグについては、「Unityの起動時に、Multiplayerボタンを表示させるか表示させないかのプログラムがうまく機能していないこと」が考えられます。
Multiplayerボタンの出現に関係するスクリプトや記述を見つけられれば、バグの手掛かりをつかめます。
バグの発生に関わっているコードを特定する
バグが発生する状況が理解出来たら、バグに関わるコードを特定します。
特定方法はスクリプトファイルをひとつひとつ探すのもいいですし、ファイルが大量にあるならサクラエディタを使ってもいいと思います。
今回はUnityを使ってゲームを作成しているので、現在バグで消えてしまっているMultiplayer用のボタンを、シーン上、もしくはヒエラルキーウィンドウ上から探します。
結局、Multiplayerボタンの名前は「ButtonGoMultiplayer」だということがヒエラルキー上、もしくはインスペクター上から分かりました。
今度はこの「ButtonGoMultiplayer」が記述されているスクリプトを探していきます。
今回はサクラエディタのGrep(グレップ)機能を使うことにします。Grep機能は、特定の記述があるスクリプトファイルを探し出してくれる機能です。使い方は以下の通りです。
サクラエディタを起動したら、サクラエディタをアクティブにした状態で、「Ctrl+G」を押します。すると以下のような画面が表示されます。
検索に必要な情報を入力します。今回であれば条件の部分に「ButtonGoMultiplayer」と入力し、フォルダはバグを引き起こしているスクリプトがあると思われるフォルダを選択。入力出来たら検索ボタンをクリックします。
しばらく待つと、検索結果が表示されます。スクリプトがいくつか出てくる場合もありますので、その場合はすべて確認していきます。
今回は1つのスクリプトファイルしか出てこなかったので、そのスクリプトを見れば「ButtonGoMultiplayer」の出現を制御する記述が書かれている可能性があります。
バグを引き起こしているスクリプトの場所がわかっているなら、サクラエディタを使う必要はありません。
スクリプトファイルが大量にある場合や、チームでの開発でスクリプトファイルがどこにあるか把握していない場合は、サクラエディタを使う方が便利です。
Visual Studioで問題のスクリプトを開き、問題のコードの内容を理解する
サクラエディタを使った結果、「ButtonGoMultiplayer」が記述されているスクリプトはひとつだけで、スクリプトのファイル名は「BBMainMenuController」だと分かりました。
ここから以下の手順で問題のコードの内容を理解していきます。
バグが発生している可能性の高いスクリプトファイルを開きます。今回は「BBMainMenuController」というスクリプトファイルです。
スクリプトは長い場合もあるので、スクリプト内検索「Ctrl+F」を押し、スクリプト内検索をします。
検索窓に調べたい単語「ButtonGoMultiplayer」を入力します。そうすると該当の場所まですばやく到達できます。
コードがどのような内容になっているのか、あるいはどのような構造になっているのか確認します。例えば今回のコードは以下の通りです。
#if !USE_PHOTON
GameObject buttMultiplayer = GameObject.Find("ButtonGoMultiplayer");
if(buttMultiplayer) {
Destroy(buttMultiplayer);
}
#endif
このコードの大まかな意味は「もしUSE_PHOTONという記述がなければ、『ButtonGoMultiplayer』というボタンを消去する」といった感じです。
つまりUSE_PHOTONという記述をどこかに入れることによって、バグが治りそうな気がします。
スクリプトを見ても全く意味が分からないことがあると思います。そういったときは簡易的ですが、下の2つの方法で調べていきます。
わからないクラスやメソッドを調べる
「Ctrl+対象のクラス名、メソッド名をクリック」することで、クラスやメソッドが定義されている場所に飛ぶことができます。
わからない指示語を調べる
「対象の指示語にマウスカーソルを合わせる」とその指示後の説明が出てきます。それでわからなければ、Google検索して意味を確認します。
問題のコードをVisual Studioでデバッグする
まずブレークポイントを設置します。簡単に説明すると「Unityでゲームを動かしたときに、ポイント部分のコードが読み込まれるとゲームが停止される」というポイントです。
ブレークポイントの設置は、下の図の灰色の部分をクリックするだけでOKです。そうすると赤いポイントが表示されます。ちなみにいくつもブレークポイントは設置することができます。
ブレークポイントが設定出来たら、今度はUnityにアタッチします。するとVisual Studioの画面がデバックの実行中という表示にかわります。
ここまで出来たら、Unityの再生ボタンをおして、ゲーム実行します。
すると先ほど設定したブレークポイントのところでゲームがとまりました。以下の画像で左側にやじるしが出ていますが、今まさにこの部分でプログラムがとまっていることを表しています。
デバッグ中にF11キーを押すことで、デバッグを最小単位の1行程ずつ進めることができます。
さきほど言ったように、このままプログラムが進んでしまっているために、ButtonGoMultiplayerボタンが消えてしまっていることがわかりました。
USE_PHOTONという記述をあらかじめシステム上に入力しておくことで、Multiplayerボタンが無事に表示されることが分かりました。
ブレークポイントまでプログラムが流れている場合、バグはそれ以降にあります。逆にプログラムがブレークポイントまで流れてこない場合は、バグがブレークポイントより前にある可能性があります。
まとめ
ということで、UnityとVisual Studioを使ったデバッグの方法についてまとめました。これができるようになると、どこにバグの原因があるのかがわかるようになります。
そしてどのように直したらいいのかという部分も理解できるようになっていくかと思います!