きゅぶろぐ

きゅぶんずの ぶろぐができて べんりだな

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("OINK_DEVELOPMENT_BUILD"), Conditional("DEVELOPMENT_BUILD"), Conditional("UNITY_EDITOR")]
    public static void Log(string category, string message)
    {
        UnityEngine.Debug.Log($"{ColorSquare(category)} {category} | {message}");
    }

    [Conditional("OINK_DEVELOPMENT_BUILD"), 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);
    }
}