(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]



Application.logMessageReceivedでログを取得 【Unity】【エディタ拡張】


このエントリーをはてなブックマークに追加



この記事でのバージョン
Unity 2018.4.19f1


はじめに

UnityのConsoleには様々なログが表示されます。

Debug.Log("普通のログ");
Debug.LogWarning("警告");
Debug.LogError("エラー");
Debug.Assert(false, "アサート");
        
try {
  int a = 1, b = 0;
  var c = a / b;
}
catch (Exception e){
  Debug.LogException(e, this);
}
f:id:kan_kikuchi:20200401042211j:plain


今回はこのログをプログラムで取得してみようという感じの記事です。

なお、上記のように自分で表示ログだけでなく、Unityが自動で表示したログも取得可能です。


Application.logMessageReceived

Unityでログを取得したい時にはApplicationのlogMessageReceivedを使います。

ログメッセージが発行されたときに受信するためのイベントハンドラー


使い方は簡単、logMessageReceivedにデリゲートを設定するだけ。

//ログが発行された時にOnReceiveLogが実行されるように
Application.logMessageReceived += OnReceiveLog;
//ログを受け取った
//logText : ログの内容
//stackTrace : ログがどこから発行されたか
//logType : ログの種類
private void OnReceiveLog(string logText, string stackTrace, LogType logType) {
    
}


例えば発行されたログを表示するウィンドウを作ってみると以下のような感じ。

using System;
using System.Text;
using UnityEditor;
using UnityEngine;

/// <summary>
/// 発行されたログを表示するウィンドウ
/// </summary>
public class LogWindow : EditorWindow {
  
  private StringBuilder _stringBuilder;
	
  //=================================================================================
  //初期化
  //=================================================================================

  //メニューからウィンドウを表示
  [MenuItem("Tools/Open/LogWindow")]
  public static void Open (){
    LogWindow.GetWindow (typeof(LogWindow));
  }
	
  //ウィンドウを開いた時に実行される(表示するパーツの設定用)
  private void OnEnable (){
    Application.logMessageReceived += OnReceiveLog;
    
    _stringBuilder = new StringBuilder();
    _stringBuilder.Append($"ログ一覧");
  }
  
  //=================================================================================
  //ログ取得
  //=================================================================================

  //ログを受け取った
  private void OnReceiveLog(string logText, string stackTrace, LogType logType) {
    _stringBuilder.Append($"\n================\nlogText\n{logText}\n\nLogType\n{logType}\n\nstackTrace\n{stackTrace}");
  }

  //=================================================================================
  //表示するGUIの設定
  //=================================================================================

  private void OnGUI(){
    if (GUILayout.Button("ログ追加ボタン")) {
      Debug.Log("普通のログ");
      Debug.LogWarning("警告");
      Debug.LogError("エラー");
      Debug.Assert(false, "アサート");
        
      try {
        int a = 1, b = 0;
        var c = a / b;
      }
      catch (Exception e)
      {
        Debug.LogException(e, this);
      }
    }
    
    EditorGUILayout.TextArea(_stringBuilder.ToString());
  }

}
f:id:kan_kikuchi:20200401042911j:plain


他にもlogMessageReceivedを使えば、VR上でログを表示するなんて事も出来ちゃったりします。

f:id:kan_kikuchi:20200331050529g:plain