はじめに
今回はUnityのログメッセージが発行されたときに処理を挟むことができるApplication.logMessageReceived
について取り上げたいと思います。
ログメッセージが発行されたときに受信するためのイベントハンドラー
このイベントはメインスレッドでのみ動作します。もしハンドラー内で、メインスレッドのみ呼び出し可能な Unity の API を使用したい場合や、なんらかの理由があった場合、スレッドセーフでないかもしれません。
概要
Debug.Log
やDebug.LogWarning
, Debug.Assert
, Debug.LogError
, Debug.LogException
などを用いてログがコンソールに出力されたときに、Application.logMessageReceived
を利用することで特定の処理を挟むことができます。
public static event Application.LogCallback logMessageReceived { add { Application.s_LogCallbackHanler += value; Application.SetLogCallbackDefined(true); } remove => Application.s_LogCallbackHandler -= value; }
public delegate void LogCallback(string condition, string stackTrace, LogType type);
またLogType
というものが存在し、ログの種類を受け取ることができます。
LogType
には以下の種類があります。
public enum LogType { /// <summary> /// <para>LogType used for Errors.</para> /// </summary> Error, /// <summary> /// <para>LogType used for Asserts. (These could also indicate an error inside Unity itself.)</para> /// </summary> Assert, /// <summary> /// <para>LogType used for Warnings.</para> /// </summary> Warning, /// <summary> /// <para>LogType used for regular log messages.</para> /// </summary> Log, /// <summary> /// <para>LogType used for Exceptions.</para> /// </summary> Exception, }
使い方
public class Test : MonoBehaviour { [SerializeField] private Text text; private void Start() { Application.logMessageReceived += (condition, stackTrace, type) => { text.text += $"[{type}] {condition} : {stackTrace}"; }; Debug.Log("Debug.Log"); Debug.LogWarning("Debug.LogWarning"); Debug.Assert(true, "これは表示されない"); Debug.Assert(false, "Debug.Assert"); Debug.LogError("Debug.LogError"); Debug.LogException(new Exception("Debug.LogException")); } }