今回はUnityのDebugクラスを使用してゲーム開発をする時に役立つようにしていきます。
Debugクラスと言えば当たり前のように
1 2 3 | Debug.Log("コンソールに出力する文字列"); |
のようにコンソールに引数で渡した文字列を表示していたと思います。
Debugクラスには他にもメソッドが用意されているのでそれらのメソッドも使ってみましょう。
Debugクラスのメソッドを使う
Debugクラスにはいくつかのメソッドがあり、引数の数が違う同じメソッドが用意されていて全ての引数を指定しなくても実行出来るものもあります。
今回はいくつかのメソッドを取り上げてみます。
Logメソッド
Logメソッドはすでに何度となく使っているので説明はいらないと思いますが、Unityのコンソールに文字列を出力する事が出来ます。
1 2 3 | Debug.Log ("出力する文字列", メッセージが適用されるオブジェクト); |
のような感じで使います。
第1引数は出力する文字列で、第2引数は使っていませんでしたがこちらはこのメッセージがどのコンテンツで発生したかを設定します。
その為第2引数ではthis.gameObject等を使いこのスクリプトが設定されているゲームオブジェクト等を指定します。
するとコンソールで出力された文字列を選択した時にヒエラルキーの指定したゲームオブジェクトがわかりやすく表示されます。
LogErrorメソッド
LogErrorメソッドはコンソールにエラー表示をするメソッドです。
スクリプトを保存しコンパイルした時にエラーがあった場合に表示されるのと同じですね。
LogErrorを使えば自身でエラー表示を行う事が出来ます。
1 2 3 | Debug.LogError("ログにエラー出力", this.gameObject); |
引数はさきほど紹介したLogと同じで、コンソールの表示がエラー表示になるだけです。
LogFormatメソッド
LogFormatメソッドはフォーマットされた文字列をコンソールに表示する事が出来ます。
1 2 3 | Debug.LogFormat (formatした文字列); |
Logメソッドでは単純な文字列を表示するだけですが、LogFormatを使うと表示するデータをフォーマットして表示する事が出来ます。
Assertメソッド
Assertメソッドを使うと設定した条件が成立しなければエラー表示を行います。
1 2 3 | Debug.Assert (条件, "表示する文字列", メッセージが適用されるオブジェクト); |
AssertFormatメソッド
AssertFormatメソッドはAssertメソッドにフォーマットした文字列を使えるということでLogFormatと同じですね。
1 2 3 | Debug.AssertFormat (条件, formatした文字列); |
LogWarningメソッド
LogWariningはコンソールに警告を表示する事が出来ます。
実行に問題はないけどなんらかの警告をしておかなければいけない時に使います。
1 2 3 | Debug.LogWarning("警告を表示"); |
スクリプトを記述しコンパイルした時にコンソールによく黄色いアイコンと一緒に表示されてるあれですね。
LogWarningFormatメソッド
LogWarningFormatメソッドは警告表示する時にフォーマット文字列を使用する事が出来ます。
1 2 3 | Debug.LogWarningFormat (formatした文字列); |
LogExceptionメソッド
例外が発生した時にコンソールにエラーを表示させます。
1 2 3 | Debug.LogException (例外変数, メッセージが適用されるオブジェクト); |
Breakメソッド
Breakメソッドはエラー等が発生した時にエディターの実行を止めます。
1 2 3 | Debug.Break (); |
この処理は呼び出せばUnityのエディターの実行を一時停止する事が出来ます。
DrawLineメソッド
UnityのSceneウインドウにレイを表示し視覚的にわかるようにします。
GameウインドウでもGizmoを有効にすると見る事が出来ます。
1 2 | Debug.DrawLine (開始位置, 終了位置, レイの色, 表示する時間, オブジェクトに隠された時に表示しないかどうか); |
DrawLineはレイの開始位置と終了位置を指定しレイを飛ばします。
引数はレイの色まで指定していれば大丈夫です。
DrawRay
DrawLineは開始位置と終了位置を指定しレイを表示しますが、
DrawRayは開始位置とレイの方向ベクトルを指定しレイを表示します。
1 2 3 | Debug.DrawRay (開始位置, レイの方向ベクトル, レイの色, 表示する時間, オブジェクトに隠された時に表示しないかどうか); |
第2引数がDrawLineと違うだけで同じように使う事が出来ます。
引数はレイの色まで指定していれば大丈夫です。
Debugクラスのサンプルを作成する
Debugクラスのメソッドのサンプルを作成し実行してみましょう。
DebugTestクラスを作成し以下のような処理を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | using UnityEngine; using System.Collections; using System; public class DebugTest : MonoBehaviour { // テスト用フィールド private int testValue1 = 2000; private float testValue2 = 10000.1f; private float testValue3 = 3f; // Use this for initialization void Start () { // コンソールにログを出力 Debug.Log ("ログに出力", this.gameObject); // コンソールにエラーを出力 Debug.LogError("ログにエラー出力", this.gameObject); // フォーマットしてコンソールに出力 string format1 = String.Format ("{0}|{1,-15:0,0.00000}|{2,3}", testValue1, testValue2, testValue3); Debug.LogFormat (format1); // アサーションテストをして失敗したらコンソールに出力 Debug.Assert (testValue1 < 1, "Assert", Camera.main.gameObject); // アサーションテストおして失敗したらフォーマットを利用しコンソールに出力 string format2 = String.Format("{0,10}|{1,10:#,0.00}|{2,10}", testValue1, testValue2, testValue3); Debug.AssertFormat (testValue1 < 1, this.gameObject, format2); // 警告をコンソールに表示 Debug.LogWarning("警告を表示", this.gameObject); // 警告をフォーマットして表示 Debug.LogWarningFormat (this.gameObject, format2); // 開始地点と終了地点を指定して線を引く Debug.DrawLine (Camera.main.transform.position, Camera.main.transform.position + Vector3.forward * 50f, Color.red, Mathf.Infinity, true); // 開始地点と方向を指定して線を引く Debug.DrawRay (Camera.main.transform.position + Vector3.up, Camera.main.transform.forward * 50f, Color.blue, Mathf.Infinity, false); } // Update is called once per frame void Update () { if (Input.GetButtonDown ("Fire1")) { try { // 例外を自発的に発生させる throw new MyException ("MyExceptionクラス"); } catch (MyException e) { // コンソールにエラーメッセージを出力 Debug.LogException (e, this.gameObject); } } else if (Input.GetButtonDown ("Fire2")) { // エディターを止める Debug.Break (); } } // 自前のExceptionクラスの作成 private class MyException : Exception { public MyException(string message) : base(message) { } } } |
コンソールに表示する時に使用するテストデータをフィールドで作成しています。
1 2 3 | string format1 = String.Format ("{0}|{1,-15:0.00000}|{2,3}", testValue1, testValue2, testValue3); |
ではフォーマットした文字列を作成していて、{}の中の数字と第2引数以降の引数とが対応しています。
それぞれに対応する引数との間には|を仕切り文字として表示し引数毎の表示をわかりやすくしています。
{0}がtestValue1、{1}がtestValue2、{2}がtestValue3に対応しています。
{1,-15:0,0.00000}
では第3引数のtestValue2の値を表示していて、,の後の-で左寄せ、15で表示桁を指定しています。
:の後は書式設定で0で対応する数字を0で表示し,で3桁毎に,が表示されるようになり、0.00000で小数点以下の桁で足りなければ0を表示します。
String.Formatの詳しい書式設定に関しては参考サイトのC#リファレンスを参照してください。
1 2 3 4 5 6 | // 開始地点と終了地点を指定して線を引く Debug.DrawLine (Camera.main.transform.position, Camera.main.transform.position + Vector3.forward * 50f, Color.red, Mathf.Infinity, true); // 開始地点と方向を指定して線を引く Debug.DrawRay (Camera.main.transform.position + Vector3.up, Camera.main.transform.forward * 50f, Color.blue, Mathf.Infinity, false); |
でレイを視覚的に表示していますが、Debug.DrawLineではメインカメラから前方にレイを飛ばしますが、第2引数は終了地点なのでメインカメラの位置+前方 * 50fになっています。
Startメソッドで実行しているのでレイを表示する時間をMathf.Infinityに設定しずっと表示するようにしています。
Updateメソッドで実行する場合はここを1fとしていてもUpdateメソッド毎にレイを表示する処理をするのでずっとレイが表示されます。
第5引数はtrueとしレイが何かで遮られた時にも手前に見えるようにしています。
Debug.DrawRayの方はメインカメラの1m上からレイを前方に50m飛ばしています。
第5引数はfalseとしレイが何かで遮られた時は手前に表示しないようにしています。
Debug.LogExceptionは例外が発生した時に実行するようにしていますが、いい例外の発生方法が思いつかなかった為、自前の例外クラスを作成し、
それを投げる事にしました。
1 2 3 4 | // 例外を自発的に発生させる throw new MyException ("MyExceptionクラス"); |
マウスの左ボタンを押した時に自前の例外クラスを実行しています。
例外クラスは
1 2 3 4 5 6 7 8 9 | // 自前のExceptionクラスの作成 private class MyException : Exception { public MyException(string message) : base(message) { } } |
Exceptionクラスを継承して作成しコンストラクタが呼ばれた時にExceptionクラスのコンストラクタを呼び出し設定しているだけです。
マウスの右ボタンを押した時はDebug.Breakメソッドでエディターの実行を一時停止するようにしています。
Debugサンプルの確認
サンプルが出来たので確認してみましょう。
エラーが発生するとエディターが停止してしまって次が実行出来ないので
↑のようにコンソールのError Pauseを無効化しておきます。
Unityの実行ボタンを押すとコンソールには
↑のように表示されました。
実行をした後にマウスの左ボタンを押して例外を発生させ、マウスの右ボタンを押してエディターを一時停止してみてください。
それぞれの実行が正しく表示されていると思います。
フォーマットを利用した表示ではそれぞれ整形した文字列が表示されていますね。
GameウインドウのGizmosのボタンを押しGizmosが表示されるようにしレイが見えるようにします。
↑のようにDebug.DrawLineでは第5引数をtrueにしている為、レイが隠された時は手前に表示しません。
Debug.DrawRayの方はfalseにしている為、手前に表示されています。
終わりに
今回はDebugクラスについて見てきました。
今まではDebug.LogやDebug.DrawLineしか使ってこなかったんですが、必要に応じて他のメソッドも活用していけたらと思います。
んーでもDebug.DrawRayぐらいしか使わないかも・・・・(^_^;)