Unityのログ表示を気軽にちょっとだけ見やすくする
Console Windowを大幅に改造してるプロジェクトも多いと思いますが、
気軽にちょっとだけ見やすくしたいこともありますよね。
完成形がこちら。

見た目の特徴
- カテゴリ毎に色の違う■が出てて、カテゴリの認識がしやすい
- パラメーターが読みやすい
書き方の特徴
Logger.Log("Sound", "Play", ("Bgm", bgmName), ("Volume", volume));
Logger.Log("Animation", "Play", ("Name", animationName), ("Duration", duration));
Logger.Log("Logic", "Calc1", ("Result1", 123), ("Result2", 234), ("Result3", 345));
Logger.Log("Logic", "Calc2", ("Result1", 123), ("Result2", 234), ("Result3", 345));
Logger.Log("Sound", "Stop", ("Bgm", bgmName));
Logger.Log("Animation", "Finish", ("Name", animationName));- カテゴリとメッセージを分けることで、特定のカテゴリだけ検索できたりして便利
- 変数をログに出したい時に、いちいち変数展開しなくても良くて書きやすい
ちなみに実際は、こんな感じでnameofでクラス名やら変数名やら出して使うことが多いです。
Logger.Log(nameof(SoundPlayer), "Play", (nameof(bgm), bgm));実装
using System.Diagnostics;
using System.Linq;
public static class Logger
{
[Conditional("DEVELOPMENT_BUILD"), Conditional("UNITY_EDITOR")]
public static void Log(string category, string message)
{
UnityEngine.Debug.Log($"{ColorSquare(category)} {category} | {message}");
}
[Conditional("DEVELOPMENT_BUILD"), Conditional("UNITY_EDITOR")]
public static void Log(string category, string message, params (string, object)[] values)
{
UnityEngine.Debug.Log($"{ColorSquare(category)} {category} | {message} | {string.Join(", ", values.Select(x => $"{x.Item1} = {x.Item2}"))}");
}
private static string ColorSquare(string s)
{
var h = ToHash(s); // 適当な方法でstring -> int変換
var c = ToColor(h); // 適当な方法でint -> Color変換
return $"<color=#{UnityEngine.ColorUtility.ToHtmlStringRGB(c)}>■</color>";
}
// 適当な方法の例 (string -> int)
private static uint ToHash(string read)
{
var hashedValue = 3234846615;
foreach (var t in read)
{
hashedValue += t;
hashedValue *= 3234846615;
}
return hashedValue;
}
// 適当な方法の例 (int -> Color)
private static UnityEngine.Color ToColor(uint hash)
{
return new UnityEngine.Color32((byte) ((hash / 3) % 256), (byte) ((hash / 5) % 256), (byte) ((hash / 7) % 256), 255);
}
}