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); } }