1루 땅볼 아웃 복귀 버그 추적 중, 콘솔에 다른 Debug.Log가 너무 많아서 내가 넣은 로그가 묻힌다, 매번 로그를 지우거나 주석 처리하는 것도 비효율적이라 고민했다.
그래서 각자 bool 변수를 만들고 그 bool를 on off를 자유롭게 해서 원하는 메세지만 로그를 뜨게 하면 어떨까? 그래서 구현해봤다.
이거 하려면 사전 세팅을 해야한다.

Edit > Project Settings > Player > Other Settings > Scripting Define Symbols 에 GAME_LOG 심볼을 추가한다. (원하는 심볼 이름으로 바꿔도 된다.)
이게 핵심인데, 각 메서드에 [Conditional("GAME_LOG")]를 붙여두면 이 심볼이 없을 때 호출부가 컴파일 단계에서 통째로 사라진다. 즉 릴리즈 빌드에서는 로그 비용이 0이 된다. 일일이 #if 로 감쌀 필요가 없다는 게 장점이다.
using System.Diagnostics;
using UnityEngine;
using Debug = UnityEngine.Debug; // System.Diagnostics.Debug와 이름 충돌 방지
/// <summary>
/// 카테고리별 토글 가능한 디버그 로거.
///
/// - 에디터에서 보고 싶은 카테고리만 bool을 true로 둔다 (런타임 토글).
/// - 모든 메서드에 [Conditional("GAME_LOG")]가 붙어 있어,
/// Scripting Define Symbols에 GAME_LOG이 없으면 호출부가 컴파일에서 통째로 제거된다 (릴리즈 비용 0).
/// ㄴ 켜는 곳: Edit > Project Settings > Player > Other Settings > Scripting Define Symbols 에 GAME_LOG 추가
///
/// 사용 예: GameLog.BallLog($"OutRunner 진입 base_index={base_index}");
/// </summary>
public static class GameLog
{
//카테고리 스위치 - 보고 싶은 것만 true
public static bool General = true;
public static bool Ball = true;
[Conditional("GAME_LOG")]
public static void Log(string msg, Object context = null)
{
if (General) Debug.Log($"<color=white>[Game]</color> {msg}", context);
}
[Conditional("GAME_LOG")]
public static void BallLog(string msg, Object context = null)
{
if (Ball) Debug.Log($"<color=cyan>[Ball]</color> {msg}", context);
}
}
GameLog.Run($"OutRunner 진입 base_index={base_index}");