2015年9月3日 星期四

關掉unity3d Debug.Log

Debug.Log 可以讓unity3d顯示我們所需的log
但是如果過多的Log,會導致unity3d效能降低
這時候通常會使用Define的方式來避掉
例如
#if Debug
    Debug.Log("error");
#endif

但是每次寫個log都要這樣寫也太麻煩了
所以會寫一個類別來管理, 就不直接使用unity提供的Debug了
例如
public class MyDebug {
    public static void Log(string message) {
#if Debug
    Debug.Log(message);
#endif
    }
}

這樣雖然解決了麻煩, 但是有另一個麻煩出現了
當我們想要看log是哪一行程式碼時, 會點兩下console
這時候就會跳到該類別裡面, 變成需要看stack去回推到想要的程式碼

但是只要加入以下的Debug.cs之後, 一切問題都解決了
#if RELEASE

using System.Diagnostics;
using UnityEngine;

public static class Debug
{
     [Conditional("RELEASE")] public static void Break(){}
     [Conditional("RELEASE")] public static void ClearDeveloperConsole(){}
     [Conditional("RELEASE")] public static void DebugBreak(){}
     [Conditional("RELEASE")] public static void DrawLine(Vector3 start, Vector3 end){}
     [Conditional("RELEASE")] public static void DrawLine(Vector3 start, Vector3 end, Color color){}
     [Conditional("RELEASE")] public static void DrawLine(Vector3 start, Vector3 end, Color color, float duration){}
     [Conditional("RELEASE")] public static void DrawLine(Vector3 start, Vector3 end, Color color, float duration, bool depthTest){}
     [Conditional("RELEASE")] public static void DrawRay(Vector3 start, Vector3 dir){}
     [Conditional("RELEASE")] public static void DrawRay(Vector3 start, Vector3 dir, Color color){}
     [Conditional("RELEASE")] public static void DrawRay(Vector3 start, Vector3 dir, Color color, float duration){}
     [Conditional("RELEASE")] public static void DrawRay(Vector3 start, Vector3 dir, Color color, float duration, bool depthTest){}

     [Conditional("RELEASE")] public static void Log(object message){}
     [Conditional("RELEASE")] public static void Log(object message, UnityEngine.Object context){}
     [Conditional("RELEASE")] public static void LogError(object message){}
     [Conditional("RELEASE")] public static void LogError(object message, UnityEngine.Object context){}
     [Conditional("RELEASE")] public static void LogException(System.Exception exception){}
     [Conditional("RELEASE")] public static void LogException(System.Exception exception, UnityEngine.Object context){}
     [Conditional("RELEASE")] public static void LogWarning(object message){}
     [Conditional("RELEASE")] public static void LogWarning(object message, UnityEngine.Object context){}
}
#endif

這樣只要在遊戲要發佈時加上RELEASE define後
所有log就會消失了, 點兩下log也成正確的跳到該行程式碼

關鍵就在於Conditional這個attribute
身為程式設計師,  你一定可以根據這份程式碼的邏輯以及這個attribute的作用
去發揮更多的功能出來, 去查查看吧

1 則留言:

  1. 會出這樣的錯耶..
    error CS0576: Namespace `global::' contains a definition with same name as alias `Debug'

    跟本來的定義重覆???

    回覆刪除