【Unity入門】Debug.Logを完全攻略!使いこなせばこんなことまで!?

今回はUnityのDebugクラスについて見ていきましょう。

その中でも一番有名な「Debug.Log関数」の使い方を、まずは説明していきますね!

そこから先は、Debug.Log以外のDebugクラスの便利な機能を見ていきましょう。

実はDebugクラスには「一時停止命令」や「線の描画」など、いろいろな有用な機能が準備されているんです。

ぜひ何ができるのか覚え、デバッグ上手になりましょう!

目次

Debug.Logの使い方

では早速Debug.Logを使用してみましょう。

「シンプルな使い方」をはじめに「警告とエラーとしての出し方」「第二引数を利用する」など、より詳しい使い方についても見いきます。

シンプルな使い方

まずはシンプルに使用してみましょう。

以下のような「DebugObject」というクラスを作成し、オブジェクトへ紐付けていたとしましょう。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DebugObject : MonoBehaviour {

    // Use this for initialization
    void Start () {

        // コンソールへ表示
        Debug.Log ("debug comment");

    }
}

内容は非常にシンプルで、Start関数で初期化時に「Debug.Log」を呼び出しているだけです。

これを実行するとログへは以下のようなコメントが表示されます。

debug comment
UnityEngine.Debug:Log(Object)
DebugObject:Start() (at Assets/DebugObject.cs:11)

内容は以下の通りです。

1行目 ・・・ 第一引数に与えた文字列
2行目以降 ・・・ プログラムでDebug.Logが呼ばれた場所

文字列を送れば、その文字列実行場所をログに表示してくれる、非常にシンプルで使いやすい関数ですね!

しかしDebug.Logの有用性はそれだけにとどまりません。

文字列以外を引数へ渡したら?

実は、Debug.Logは文字列以外も送れます。

文字列以外の物を送ってみましょう。

※行が長くなるので、これ以降の結果は1行目のみの表記とします。

数字を引数へ渡す

プログラム:

Debug.Log (1000);

実行結果:

1000

無難にちゃんと数字が出力されます。

nullを引数へ渡す

プログラム:

Debug.Log (null);

実行結果:

Null

nullを送っても、ちゃんと判断してくれます。

クラスを引数へ渡す

プログラム:

Debug.Log (this.gameObject);

実行結果:

Cube (DebugObject)

クラスを送ると、紐付いているオブジェクト名と、クラス名が帰ってきます。

※オブジェクト名がCubeなのは、今回のサンプルプログラムがCubeという名前のオブジェクトに紐付けているからです。

構造体を引数へ渡す

プログラム:

Debug.Log (new Vector3(100.0f,100.0f,100.0f));

実行結果:

(100.0, 100.0, 100.0)

中身の数値が表示されます。

地味に便利でありがたいですね。

警告とエラーとしての出し方

Debug.Logには、警告やエラーとしてログを表示することのできる類似の関数があります。

LogUnity Console にメッセージを記録します。
LogErrorDebug.Log の派生でエラーメッセージをコンソールに出力します。
LogWarningDebug.Log の派生で警告メッセージをコンソール出力します。

使用例

Debug.Log (1000);
Debug.LogError (1000);
Debug.LogWarning (1000);

結果

unity-debug-1

致命的なエラーは「LogError」を使うなど、うまく使い分けましょう。

文字色・文字サイズの変更

使いどころは難しいかもしれませんが、Deubg.Logはリッチテキストが使えます。

それを使えば文字色などの変更が可能です。

Debug.Log ("<color=#ff0000ff>debug comment</color>"); // 赤色で表示
Debug.Log ("<color=#00ff00ff>debug comment</color>"); // 緑色で表示
Debug.Log ("<color=#0000ffff>debug comment</color>"); // 青色で表示
Debug.Log ("<i>debug comment</i>");             //斜体で表示
Debug.Log ("<b>debug comment</b>");             //太文字で表示
Debug.Log ("<size=30>debug comment</size>");    //大きく表示

unity-debug-2

目立つログを用意するには有用かもしれません。

※リッチテキストについて、もっと詳細が知りたい場合は参照をご覧ください。

参照元:https://docs.unity3d.com/ja/current/Manual/StyledText.html

第二引数を利用する

実はDebug.Logには第二引数がありGameObjectを送ることができます。

送っている場合コンソールでそのログをクリックした時「Hierarcyhy」にて、そのゲームオブジェクトが強調表示されます。

Debug.Log (1000, this.gameObject);

unity-debug-3

コンソールでクリック時、強調表示されてます。

地味に便利な機能なので覚えておきましょう。

ログの出力レベル設定

※これは少し上級者むけの話なので、初心者の方は呼び飛ばしても問題ありません。

とても便利なDebug.Logですが、リリース環境ではセキュリティや処理速度の面を考えると、出力したくないですよね。

その場合は「メニューのFile」→「BuildSettings」→「PlayerSettings」→「Logging」の設定をいじりましょう。

unity-debug-6

不必要なログは、None設定にしてしまいましょう。

ちなみにFullにすると、自分の書いたスクリプト外の、細かい処理もログとして表示されます。

Debugクラスについて学んでみよう!

ここまでで「Deubg.Log」についてさまざまなことを学んできました。

いろいろなことができて便利ですね!

そして次はその大元の「Deubgクラス」について見ていきましょう。

「Deubg.Log」ばかりに目が行きがちですが「Debugクラス」にも便利な機能がたくさんあるんですよ!

これを機会に少し学んでみましょう。

一時停止ができる「Break」

Unityエディタ上で一時停止を発生させることができます。

Debug.Break ();

プログラムを使用すると、以下の画像のようにUnityエディタ上で「一時停止」ボタンを押した時と同じ挙動になります。

unity-debug-4

ブレークポイントに近い機能ですね。

いろいろなチェックに使えて便利な機能です。

Break関数の注意点

しかしこの機能一点気をつけなければなりません。

この関数は「使用した瞬間」に、プログラムが完全に停止するわけではないのです。

正確にはこの関数を使用した、次のフレームに入る前に停止をします。

次のプログラムは「Debug.Log ("step2");」の前に「Debug.Break ();」を呼んでいます。

// Use this for initialization
void Start () {

            Debug.Log ("step1");
            Debug.Break ();
            Debug.Log ("step2");

}

単純に考えれば「step1」のみ表示されて、一時停止される気がしますよね。

しかし結果は以下となります。

unity-debug-5

「step1」「step2」どちらも表示されてから停止されます。

この辺りの一時停止の仕様には気をつけましょう。

「DrawLine・DrawRay関数」によるライン描画

※これも少し上級者向けなので、初心者の人は流し見でもよいかもしれません。しかしこんなこともできることは覚えておきましょう。

DrawLine関数DrawRay関数」を使用することで、デバッグ用にScene画面内に線を引くことができます。

unity-debug-7

方向・座標の確認や、Rayまわりのデバッグ時に役立ちますし、ツール作成時に利用するのも有用でしょう。

上記画面のスクリプトは以下の通りです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DebugObject : MonoBehaviour {

    void Update () {

        Debug.DrawLine( new Vector3( 2.0f,0.0f,0.0f),
                        new Vector3( 2.0f,5.0f,5.0f),
                        Color.green);

        Debug.DrawRay(  new Vector3( 0.0f,0.0f,0.0f),
                        new Vector3( 0.0f,5.0f,5.0f),
                        Color.red);

    }
}

※試す時は先ほどのDebug.Logの時と違い、Update関数の中で関数を呼び出していることに注意してください。呼び出した瞬間にしか線は描画されません。

この二つの関数は似たような機能ですが、主に第二引数の扱いが違います。

Debug.DrawLine関数

第1引数 ・・・ ラインの開始位置(ワールド座標)
第2引数 ・・・ ラインの終了位置(ワールド座標)
第3引数 ・・・ ラインの色

こちらは「どこからどこまで」といった引き方をする場合に使うことになります。

参照元:https://docs.unity3d.com/ja/current/ScriptReference/Debug.DrawLine.html

Debug.DrawRay

第1引数 ・・・ レイを開始する位置(ワールド座標)
第2引数 ・・・ レイの向きと長さ
第3引数 ・・・ ラインの色

こちらはDrawLine関数とは違い、第2引数が向きと長さになっています。

名前の通り特定のオブジェクトからRayを飛ばす場合につかえますね。

参照元:https://docs.unity3d.com/ja/current/ScriptReference/Debug.DrawRay.html

まとめ

今回はDebugクラスについて見てきました。

デバッグは開発には欠かせない工程です。

このクラスをうまく利用し、上手にデバッグを行いましょう!

この記事を書いた人

学生時代を含めると、かれこれ10年以上プログラマーとして過ごしています。
様々な言語や環境、プロジェクトに関わってきましたので、より実践的な記事をみなさんにお届きるよう情報発信していきます!

目次