MRが楽しい

MRやVRについて学習したことを書き残す

Hololens2のアプリ内でデバッグログのメッセージとスタックトレースを表示する

本日は Unity の小ネタ枠です。
Hololens2のアプリ内でデバッグログのメッセージとスタックトレースを表示する手順を記事にします。
f:id:bluebirdofoz:20200901230222j:plain

ログメッセージの取得

ログの発生イベントを取得するには以下の Application.logMessageReceived を使います。
docs.unity3d.com

サンプルシーンの作成

MRTKを使ってHoloLens2上で動作するサンプルシーンを作成します。
シーン内にメッセージを表示するためのキャンバスとパネルオブジェクトを配置します。
f:id:bluebirdofoz:20200901224628j:plain

MRTKを使ったプロジェクトの作成手順は以下を参照してください。
bluebirdofoz.hatenablog.com

ログメッセージを表示するテキストオブジェクトを配置します。
ここに Application.logMessageReceived でメッセージを取得するスクリプトをアタッチします。
f:id:bluebirdofoz:20200901224725j:plain
・LogMessageText.cs

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

// 必須コンポーネントを指定
[RequireComponent(typeof(Text))]
public class LogMessageText : MonoBehaviour
{
    /// デバッグログ用テキスト
    /// </summary>
    private Text p_Text;

    /// <summary>
    /// 表示行数
    /// </summary>
    [SerializeField, Tooltip("表示行数")]
    private int p_LineNum = 30;

    private string[] linecodes = new string[] { "\n", "\r", "\r\n" };

    /// <summary>
    /// 初期化関数
    /// </summary>
    private void Awake()
    {
        // Logメッセージイベント追加
        Application.logMessageReceived += LogMessageOutput;

        p_Text = this.GetComponent<Text>();
    }

    /// <summary>
    /// Logメッセージイベント処理
    /// </summary>
    private void LogMessageOutput(string condition, string stackTrace, LogType type)
    {
        switch (type)
        {
            case LogType.Error:
                // ログメッセージとスタックトレースを表示
                ShowMessage(p_Text.text, condition, stackTrace);
                break;
            case LogType.Assert:
                // ログメッセージとスタックトレースを表示
                ShowMessage(p_Text.text, condition, stackTrace);
                break;
            case LogType.Warning:
                // ログメッセージのみ表示
                ShowMessage(p_Text.text, condition, "");
                break;
            case LogType.Log:
                // ログメッセージを表示
                ShowMessage(p_Text.text, condition, "");
                break;
            case LogType.Exception:
                break;
        }
    }

    /// <summary>
    /// 指定行数でのメッセージ表示処理
    /// </summary>
    private void ShowMessage(string basetext, string message, string stacktrace)
    {
        string[] baselines = basetext.Split(linecodes, System.StringSplitOptions.RemoveEmptyEntries);
        string[] messagelines = message.Split(linecodes, System.StringSplitOptions.RemoveEmptyEntries);
        string[] tracelines = stacktrace.Split(linecodes, System.StringSplitOptions.RemoveEmptyEntries);

        List<string> lines = new List<string>();
        lines.AddRange(baselines);
        lines.AddRange(messagelines);
        foreach(string trace in tracelines)
        {
            lines.Add(" " + trace);
        }

        int linecount = 0;
        string textmessage = "";
        if (lines.Count > p_LineNum)
        {
            linecount = lines.Count - p_LineNum;
        }
        for (int num = linecount; num < lines.Count; num++)
        {
            if (lines[num].Length > 0)
            {
                textmessage += lines[num] + linecodes[0];
            }
        }
        
        p_Text.text = textmessage;
    }
}

最後に動作確認のため、以下のデバッグログメッセージを出力するスクリプトを追加しました。
f:id:bluebirdofoz:20200901224803j:plain
・TestLog.cs

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

public class TestLog : MonoBehaviour
{
    void Start()
    {
        Debug.Log("!!! Test Debug Log Message !!!");
        Debug.LogError("!!! Test Error Log Message !!!");
    }
}

HoloLensでの動作確認

プロジェクトをHoloLensにデプロイして動作確認を行います。
実機でスタックトレースの詳細を確認する場合は、ビルドの際に[Debug]でビルドを行います。
f:id:bluebirdofoz:20200901230210j:plain

以下の通り、ログメッセージとスタックトレースが表示されれば成功です。
f:id:bluebirdofoz:20200901230222j:plain