コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】Debug.Log をメソッドチェーンで書けるようにする拡張メソッド

ソースコード

using UnityEngine;

namespace Kogane
{
    public static class DebugLogMethodChainingExtensionMethods
    {
        public delegate void LogDelegate( object item );

        public static LogDelegate OnLog        { get; set; } = item => Debug.Log( item );
        public static LogDelegate OnLogWarning { get; set; } = item => Debug.LogWarning( item );
        public static LogDelegate OnLogError   { get; set; } = item => Debug.LogError( item );

        public static T DebugLog<T>( this T self )
        {
            OnLog?.Invoke( self );
            return self;
        }

        public static T DebugLogWarning<T>( this T self )
        {
            OnLogWarning?.Invoke( self );
            return self;
        }

        public static T DebugLogError<T>( this T self )
        {
            OnLogError?.Invoke( self );
            return self;
        }
    }
}

使用例

public string GetDisplayName()
{
    var id   = 25;
    var name = "ピカチュウ";

    return $"{id}: {name}";
}

たとえば上記のような関数で戻り値の値をログ出力したい場合、

public string GetDisplayName()
{
    var id   = 25;
    var name = "ピカチュウ";

    var result = $"{id}: {name}";
    
    Debug.Log( result );

    return result;
}

通常であればこのようにローカル変数を定義する必要がありますが

public string GetDisplayName()
{
    var id   = 25;
    var name = "ピカチュウ";

    return $"{id}: {name}".DebugLog();
}

拡張メソッドを使えばローカル変数の定義が不要になります