本日は Unity の小ネタ枠です。
Hololens2のアプリ内でデバッグログのメッセージとスタックトレースを表示する手順を記事にします。
ログメッセージの取得
ログの発生イベントを取得するには以下の Application.logMessageReceived を使います。
docs.unity3d.com
サンプルシーンの作成
MRTKを使ってHoloLens2上で動作するサンプルシーンを作成します。
シーン内にメッセージを表示するためのキャンバスとパネルオブジェクトを配置します。
MRTKを使ったプロジェクトの作成手順は以下を参照してください。
bluebirdofoz.hatenablog.com
ログメッセージを表示するテキストオブジェクトを配置します。
ここに Application.logMessageReceived でメッセージを取得するスクリプトをアタッチします。
・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; } }
最後に動作確認のため、以下のデバッグログメッセージを出力するスクリプトを追加しました。
・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 !!!"); } }