PhysApp

趣味と開発関連のメモ置き場です

実機の画面にDebug.Logを表示させる

Unityのデバッグログ(Debug.Log)を実機の画面に表示させて確認する方法のメモ。

今回作るのはこんな感じのもの。OnGUIで特にいじらずシンプルに。

記事下のおまけにもっと表示をいじったものを貼ってありますが、気になる方などはぜひ最後まで。

f:id:physif:20191124061241j:plain

ログを受け取る

受け取る前にクラスを用意しておく。受け取る時は

の3つが取れるので対応する項目を作る。こんな感じ。

/// <summary>
/// ログの内容
/// </summary>
public class LogData {
    // メッセージ
    public string condition;
    // スタックトレース
    public string stacktrace;
    // ログの種類
    public LogType type;

    /// <summary>
    /// コンストラクタ
    /// </summary>
    /// <param name="condition">メッセージ</param>
    /// <param name="stacktrace">スタックトレース</param>
    /// <param name="type">ログの種類</param>
    public LogData( string condition, string stacktrace, LogType type ) {
        this.condition = condition;
        this.stacktrace = stacktrace;
        this.type = type;
    }
}

クラスを作れたら、上のログLogDataの型でリストを用意して、

そこに入ってきたログの情報を貯めていくようにする。

// ログリスト
private List< LogData > m_LogEntries = new List< LogData >( );

用意ができたらログを受け取れるようにする。

受け取る関数を用意したら、先程用意したログのリスト(m_LogEntries)に追加する処理を書く。

また、開始時や有効時、終了、無効時にログのコールバックイベントの登録/破棄をそれぞれ設定する。

受け取る関数を用意していてもコールバックイベントを登録していなければ受け取れないので注意。

// コールバックイベントを登録する
void Start( ) {
    Application.logMessageReceived += this.LogReceive;
}

// コールバックイベントを破棄する
void OnDestroy( ) {
    Application.logMessageReceived -= this.LogReceive;
}

/// <summary>
/// ログが出力されるたびに呼ばれる
/// </summary>
/// <param name="condition">メッセージ</param>
/// <param name="stackTrace">スタックトレース</param>
/// <param name="type">ログの種類</param>
public void LogReceive( string condition, string stackTrace, LogType type ) {
    // スタックトレースを置き換え
    stackTrace = stackTrace.Trim( );
    if ( string.IsNullOrEmpty( stackTrace ) ) {
        // System.Diagnosticsが必要。ファイル、行数を表示できる
        stackTrace = new StackTrace( true ).ToString( );
    }

    LogData log = new LogData( condition.Trim( ), stackTrace, type );

    // ログを追加
    m_LogEntries.Add( log );
}

これでログをリストに格納していくことができる。

uGUIを使って表示させる場合はログを追加した後にEvent使ってuGUIリスト側の表示を更新させるとかするといいと思う。

後はOnGUIでもuGUIでも良いのでリストから取得して表示する。

下はOnGUIで書く場合の例。ログをboxのスキンで表示するようにしてみた。

void OnGUI( ) {
    // スタイルの設定
    GUIStyle logStyle = new GUIStyle( GUI.skin.box );
    logStyle.alignment = TextAnchor.UpperLeft;
    logStyle.richText = true;
    logStyle.wordWrap = true;

    // ログの描画
    for ( int i = m_LogEntries.Count - 1; i >= 0; --i ) {
        string text = string.Format( "{0}\n{1}", m_LogEntries[ i ].condition, m_LogEntries[ i ].stacktrace );
        GUILayout.Box( text, logStyle );
    }
}

ログを画面に表示させてみる

キーを押したらログが出るようにしてみる。

それぞれ対応するテキストを出すようにした。

void Update( ) {
    if ( Input.GetKeyDown( KeyCode.I ) ) UnityEngine.Debug.Log( "Logだよ" );
    if ( Input.GetKeyDown( KeyCode.W ) ) UnityEngine.Debug.LogWarning( "Warningだよ" );
    if ( Input.GetKeyDown( KeyCode.E ) ) UnityEngine.Debug.LogError( "Errorだよ" );
}

このようにログの内容を画面に表示させることができた。

f:id:physif:20191124061241j:plain
表示された

今回作成したソースをあげておきました。

おまけ

もっとOnGUIの表示をいじっていくとこんな感じにできる。

これはuGUIに移行する前に自分が使っていたデバッグコンソール。

f:id:physif:20191124062159p:plain

ログ内容がクリックすると出てくるみたいな。

f:id:physif:20191124062208p:plain

時間かけてちゃんとしたデバッグコンソールを作るなら、uGUIで作ることをおすすめします。

OnGUIのやり方パフォーマンス悪いけど、表示させたら端末動作が極端にがくがくになるって事はないので、

なるべく実際のプレイに近い環境で表示させたい!って場合はuGUIで表示させて、

特に気にしてなければOnGUIに書いていく方式でもいいかもです。