この記事は Unity #2 Advent Calendar 2018 9日目の記事です。
ログごとにスタックトレースの有無を切り替える
Unityに限らずバグ調査でスタックトレースは大変重宝しますが、 UnityEngine.Debug
クラスが出力するスタックトレースは冗長です。そのため logcat 等では実機ログがものすごい速度で流れてしまい……。
ログによってはスタックトレースは不要なので、切り替えられるようにします。
Application.SetStackTraceLogType
UnityEngine.Application.SetStackTraceLogType 関数で、以降のログ出力のスタックトレース情報を変更することができます。
サンプルコード
Debug.cs
public static class Debug
{
public static void LogError(object message, UnityEngine.StackTraceLogType stackTraceType = UnityEngine.StackTraceLogType.ScriptOnly)
{
LogInternal(UnityEngine.LogType.Error, message, stackTraceType);
}
public static void LogWarning(object message, UnityEngine.StackTraceLogType stackTraceType = UnityEngine.StackTraceLogType.ScriptOnly)
{
LogInternal(UnityEngine.LogType.Warning, message, stackTraceType);
}
public static void Log(object message, UnityEngine.StackTraceLogType stackTraceType = UnityEngine.StackTraceLogType.ScriptOnly)
{
LogInternal(UnityEngine.LogType.Log, message, stackTraceType);
}
private static void LogInternal(UnityEngine.LogType logType, object message, UnityEngine.StackTraceLogType stackTraceType)
{
var currentStackTraceType = UnityEngine.Application.GetStackTraceLogType(logType);
if (currentStackTraceType != stackTraceType)
{
UnityEngine.Application.SetStackTraceLogType(logType, stackTraceType);
}
switch (logType)
{
case UnityEngine.LogType.Error:
UnityEngine.Debug.LogError(message);
break;
case UnityEngine.LogType.Warning:
UnityEngine.Debug.LogWarning(message);
break;
case UnityEngine.LogType.Log:
UnityEngine.Debug.Log(message);
break;
}
if (currentStackTraceType != stackTraceType)
{
UnityEngine.Application.SetStackTraceLogType(logType, currentStackTraceType);
}
}
}
Main.cs
using UnityEngine;
public class Main : MonoBehaviour
{
void Start()
{
Debug.Log("スタックトレースあり");
Debug.Log("スタックトレースなし", StackTraceLogType.None);
}
}