はじめに
動作検証する際にDebug.Log()を多用すると思います。これまではリリース時にいちいちコメントアウトや削除などをしたり、logEnabled = false
にしてログが出ないようにしていました。
Debug.unityLogger.logEnabled = false;
ただ、これはログが表示されないだけで、Debug.Log()自体は呼ばれてしまいます。またDebug.Log()の処理がそもそも重いので負荷がかかったままになってしまいます。知ってはいましたが、これまで対処できていませんでした。時間ができたのでいろいろ調べたところ、割と簡単に対処できたのでサンプルコードを紹介します。
サンプルコード
using UnityEngine;
public static class DevLog
{
#if !(UNITY_EDITOR || DEVELOPMENT_BUILD)
[System.Diagnostics.Conditional("ARASHI_ARASHI")]
#endif
public static void Log(string msg)
{
Debug.Log(msg);
}
#if !(UNITY_EDITOR || DEVELOPMENT_BUILD)
[System.Diagnostics.Conditional("ARASHI_ARASHI")]
#endif
public static void LogWarning(string msg)
{
Debug.LogWarning(msg);
}
#if !(UNITY_EDITOR || DEVELOPMENT_BUILD)
[System.Diagnostics.Conditional("ARASHI_ARASHI")]
#endif
public static void LogError(string msg)
{
Debug.LogError(msg);
}
}
なんと、これだけです!簡単に解説します。
if !(UNITY_EDITOR || DEVELOPMENT_BUILD)
これはUNITY_EDITOR
でもDEVELOPMENT_BUILD
でも無い、という意味になります。EditorまたはDevelopmentBuildの時だけ有効になります。
[System.Diagnostics.Conditional(“ARASHI_ARASHI”)]
これは()内に指定した定数が定義されていれば下に続くメソッドを実行し、定義されていなければ実行しない、かつ呼び出し側も削除されるという機能になります。ARASHI_ARASHI
の部分は、プラグインなども含めて他で定義されそうもない名前であれば何でも良いです。具体的にはProject Settings
>Player
>Other Settings
>Scripting Define Symbols
に記載されてなければ良いです。
一見ややこしいですが上の2つを掛け合わせることで以下を実現させています。
Editor
またはDevelopmentBuild
の時はSystem.Diagnostics.Conditional()
が無視されて普通にメソッドが呼び出されますEditor
またはDevelopmentBuild
のどちらでも無い時はSystem.Diagnostics.Conditional()
が有効になりますが、ARASHI_ARASHI
が定義されていないのでメソッドも呼び出し側も削除されます
使い方
DevLog
はStaticクラスにしているのでシーンに配置する必要はありません。下記の要領で普通に他のスクリプトから呼び出して下さい。
DevLog.Log(“You are my soul soul いつもすぐそばにある♪”);
Debug.Log
ではなくDevLog.Log
を使ってください- 開発時に端末側でログを表示したい時は
DevelopmentBuild
をオン - リリース時に端末側でログを削除したい時は
DevelopmentBuild
をオフ
以上です。アプリの負荷が少しでも軽くなれば幸いです。
参考
Unityは"DEVELOPMENT_BUILD"で「Development Build」を有効にしてビルドされているか判定できますが、SerializeFieldを含める時は"UNITY_EDITOR"もセットでOR条件に入れてあげないとInspectorから編集できない点に注意https://t.co/Jto4YlPp0V pic.twitter.com/t6lK60vsjr
— AMAGAMI / Inagaki Masaya (@ina_amagami) April 1, 2021