11.

Unity Debug.Log 完全ガイド — コンソール出力とデバッグ

編集
この記事の要点
  • Unity で最も基本のデバッグ手段は Debug.Log("message")。Console ウィンドウに白文字で表示される
  • 警告は Debug.LogWarning (黄)、エラーは Debug.LogError (赤)。エラーは PauseOnError 設定で即座に停止可能
  • 文字列補間 Debug.Log($"pos: {transform.position}") で変数を埋め込み
  • Scene ビューにライン描画なら Debug.DrawLine(a, b, Color.red) / Debug.DrawRay
  • 本番ビルドで除外するなら [Conditional("UNITY_EDITOR")] 属性付き wrapper、または UNITY_EDITOR プリプロセッサ
  • ログファイル出力は Application.persistentDataPathStreamWriter、Player.log は OS ごとに既定パス

Debug.Log の基本

Unity の Console ウィンドウに文字列を出力する最も簡単な方法です。MonoBehaviour を継承しているクラスでも、純粋な C# クラスでも使えます。

using UnityEngine;

public class Player : MonoBehaviour {
    void Start() {
        Debug.Log("Player Start");                // 白
        Debug.LogWarning("HP low!");              // 黄
        Debug.LogError("Cannot find weapon!");    // 赤

        // 例外のスタックトレース付き
        try {
            throw new System.InvalidOperationException("bad state");
        } catch (System.Exception e) {
            Debug.LogException(e);
        }
    }
}

ログレベルと表示

メソッド用途
Debug.Log一般情報・デバッグ確認
Debug.LogWarning異常ではないが注意したい状況
Debug.LogErrorエラー (Pause on Error 有効時にゲーム停止)
Debug.LogAssertionAssert 失敗時の出力
Debug.LogException例外オブジェクトを出力 (スタックトレース付き)

Console ウィンドウ右上のアイコンでレベル別フィルタが可能。Error Pause ボタンを ON にすると LogError 発生時に自動でゲームが Pause します。

変数を埋め込む

using UnityEngine;

public class Mover : MonoBehaviour {
    void Update() {
        // C# 6+ 文字列補間 ($ プレフィックス)
        Debug.Log($"pos: {transform.position}, time: {Time.time:F2}");

        // 旧来の string.Format / 連結
        Debug.Log(string.Format("pos: {0}", transform.position));
        Debug.Log("pos: " + transform.position);

        // Object 参照を渡すと Console でクリック時にハイライト
        Debug.Log("clicked", this.gameObject);
    }
}

Scene ビューに線を描画 (Debug.DrawLine / DrawRay)

テキスト出力ではなく Scene ビューに視覚的にラインを描画してデバッグできます:

using UnityEngine;

public class Sight : MonoBehaviour {
    public Transform target;

    void Update() {
        // 始点 → 終点 のライン (1 フレームのみ表示)
        Debug.DrawLine(transform.position, target.position, Color.red);

        // 始点から方向へのレイ
        Debug.DrawRay(transform.position, transform.forward * 5f, Color.green);

        // 永続表示 (duration 指定、depthTest=false で隠面も描画)
        Debug.DrawLine(Vector3.zero, Vector3.up, Color.yellow, 5f, false);
    }
}

※ Game ビューには表示されません (Scene ビュー専用)。Gizmos.DrawLine は OnDrawGizmos 内専用で永続表示可能です。

本番ビルドからログを除外

Debug.Log は本番ビルドでも実行されるとパフォーマンスを食う (文字列の boxing / GC alloc / ファイル出力)。本番では除外したいケースが多いです:

using System.Diagnostics;
using UnityDebug = UnityEngine.Debug;

public static class DLog {
    [Conditional("UNITY_EDITOR"), Conditional("DEVELOPMENT_BUILD")]
    public static void Log(object msg) {
        UnityDebug.Log(msg);
    }

    [Conditional("UNITY_EDITOR"), Conditional("DEVELOPMENT_BUILD")]
    public static void LogWarning(object msg) {
        UnityDebug.LogWarning(msg);
    }
}

// 利用
DLog.Log("これは Editor / Development Build でのみ出力");
// ↑ Release ビルドでは呼び出しごと削除される (引数評価もスキップ)

[Conditional] 属性は引数評価もコンパイラがスキップするため、$"..." 文字列補間の GC alloc も発生しません。これが #if UNITY_EDITOR より優れる点。

ログをファイルに書き出す

using System.IO;
using UnityEngine;

public static class FileLogger {
    private static string path = Path.Combine(Application.persistentDataPath, "game.log");

    static FileLogger() {
        Application.logMessageReceived += OnLog;
    }

    private static void OnLog(string condition, string stackTrace, LogType type) {
        File.AppendAllText(path,
            $"[{System.DateTime.Now:HH:mm:ss}] {type}: {condition}\n{stackTrace}\n");
    }
}

Player.log の場所 (ビルド済アプリのログ)

プラットフォームパス
Windows%USERPROFILE%\AppData\LocalLow\\\Player.log
macOS~/Library/Logs///Player.log
Linux~/.config/unity3d///Player.log
Androidadb logcat -s Unity で取得
iOSXcode の Devices & Simulators → デバイスログ

Console ウィンドウの便利機能

  • Clear on Play: 再生開始時に自動クリア
  • Collapse: 同一ログをまとめて回数だけ表示
  • ダブルクリックでスタックトレースの該当行にジャンプ
  • Project Settings → Player → Stack Trace でレベル別にスタックトレース取得可否を設定 (本番では Off 推奨)

FAQ

Q: Debug.Log が表示されない
A: Console 右上の レベルフィルタが OFF になっていないか確認。または別シーンで実行している可能性。

Q: ビルドした EXE のログを見たい
A: 上記 Player.log を確認。Windows なら --log-file ./game.log 起動オプションでパス指定可。

Q: Debug.Log は遅い?
A: 遅いです。Update 内で毎フレーム呼ぶと顕著にカクつきます。本番では [Conditional] wrapper で除外を推奨。

Q: Color や HTML で装飾したい
A: Debug.Log("Hit!") で Rich Text 装飾可。Console の Use Player Log と同じ書式。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. スクリプトの作成と実行
  2. C# のクラス一覧
  3. シーンの移動方法
  4. オブジェクトの移動・回転
  5. キーボードの入力値を受け取る
  6. オブジェクトの取得とコンポーネントの取得
  7. 衝突時の処理
  8. Webページを開く
  9. コンポーネントの取得
  10. 処理を一定時間待つ
  11. コンソールへのログ出力方法
  12. 飛行機の加速と減速
  13. ジェットエンジンのエフェクトとオーディオ