Debugクラスの関数を無効にする方法

2020年12月8日

この記事では、UnityでUnityEngine.Debugクラスの関数を無効にするクラスの作り方について説明します。

作り方

同名のクラスを作成する

Debugクラスを上書きするため、同名の静的クラスを作ります。

public static class Debug
{
}

Debugクラスにある静的メンバ関数を同名のクラスに「空」で定義する

Debugクラスの定義を確認し、その中にある静的メンバ関数を同名のクラスに「空」で定義します。

using UnityEngine;

public static class Debug
{
    public static void Assert( bool condition, string format, params object[] args ) {}
    public static void Assert( bool condition, string message, Object context ) {}
    public static void Assert( bool condition ) {}
    public static void Assert( bool condition, object message, Object context ) {}
    public static void Assert( bool condition, string message ) {}
    public static void Assert( bool condition, object message ) {}
    public static void Assert( bool condition, Object context ) {}
    public static void AssertFormat( bool condition, Object context, string format, params object[] args ) {}
    public static void AssertFormat( bool condition, string format, params object[] args ) {}
    public static void Break() {}

    // 他の関数もすべて定義
}

#endif

関数呼び出しを無視させるためにConditional属性を付ける

関数を呼び出した際に無視させるため、関数にダミーのシンボルを対象としたConditional属性を付けます( シンボル名はなんでもよいですが、ここでは「"DUMMY"」とします )。

using UnityEngine;
using System.Diagnostics;

public static class Debug
{
    [Conditional("DUMMY")] public static void Assert( bool condition, string format, params object[] args ) {}
    [Conditional("DUMMY")] public static void Assert( bool condition, string message, Object context ) {}
    [Conditional("DUMMY")] public static void Assert( bool condition ) {}
    [Conditional("DUMMY")] public static void Assert( bool condition, object message, Object context ) {}
    [Conditional("DUMMY")] public static void Assert( bool condition, string message ) {}
    [Conditional("DUMMY")] public static void Assert( bool condition, object message ) {}
    [Conditional("DUMMY")] public static void Assert( bool condition, Object context ) {}
    [Conditional("DUMMY")] public static void AssertFormat( bool condition, Object context, string format, params object[] args ) {}
    [Conditional("DUMMY")] public static void AssertFormat( bool condition, string format, params object[] args ) {}
    [Conditional("DUMMY")] public static void Break() {}

    // 他の関数もすべて定義
}

クラスの有効・無効を切り替えられるようにする

#if#endifディレクティブを利用して、DISABLE_DEBUG_FUNCTIONSというシンボルが定義されている場合のみコンパイルするようにします。これでDebugクラスの関数を無効にするクラスは完成です。

#if DISABLE_DEBUG_FUNCTIONS

using UnityEngine;
using System.Diagnostics;

public static class Debug
{
    [Conditional("DUMMY")] public static void Assert( bool condition, string format, params object[] args ) {}
    [Conditional("DUMMY")] public static void Assert( bool condition, string message, Object context ) {}
    [Conditional("DUMMY")] public static void Assert( bool condition ) {}
    [Conditional("DUMMY")] public static void Assert( bool condition, object message, Object context ) {}
    [Conditional("DUMMY")] public static void Assert( bool condition, string message ) {}
    [Conditional("DUMMY")] public static void Assert( bool condition, object message ) {}
    [Conditional("DUMMY")] public static void Assert( bool condition, Object context ) {}
    [Conditional("DUMMY")] public static void AssertFormat( bool condition, Object context, string format, params object[] args ) {}
    [Conditional("DUMMY")] public static void AssertFormat( bool condition, string format, params object[] args ) {}
    [Conditional("DUMMY")] public static void Break() {}

    // 他の関数もすべて定義
}

#endif

使い方

DISABLE_DEBUG_FUNCTIONSを定義

「Project Settings」>「Player」> 「Other Settings」 > 「Scripting Define Symbols」に「DISABLE_DEBUG_FUNCTIONS」を入力します。

これで作成したクラスが有効化( UnityEngine.Debugクラスが上書き )され、Debugクラスの関数を無効にできます。

注意点

下記の場合は作成したクラスを有効にしても、UnityEngine.Debugクラスの関数が呼ばれるため、注意してください。

UnityEngineの名前空間の中で関数を呼び出した時

namespace UnityEngine
{
    public class Test : MonoBehaviour
    {
        void Start()
        {
            Debug.Log( "この文字列は出力されます。" );
        }
    }
}

明示的にUnityEngineの名前空間を指定した時

using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        Debug.Log( "この文字列は出力されません。" );
        UnityEngine.Debug.Log( "この文字列は出力されます。" );
    }
}

完成したプログラム

参考ページ