I have a custom template class for new C# class in Unity. Mostly cause I was too „lazy“ to use a debug singelton class or enhance the GameObject/Object class with a custom debug function.
protected void dbg(string message, bool error = false)
{
if (debugMode & !error)
Debug.Log("[ " + this.GetType().Name + " ( " + Time.time + " / " + Time.frameCount + " )] " + message);
if (error)
Debug.LogError("<color=\"red\">[" + this.GetType().Name + " (" + Time.time + ")] " + message + "</color>");
}
So now I have a lot of Classes using this function and it can be turned off in the inspector with a toggle. But after a while of course this ends in chaos, since when you just want a certain aspect you are working appear in the console, you have to go through all of those classes and turn debug off manualy.
Instead I now added a static menu function that uses reflection to turn the debug state of each class on or off globally.
#if UNITY_EDITOR
using UnityEditor;
using System.Reflection;
#endif
[MenuItem("InterAction Project/Global Debug Toogle - On")]
public static void GlobalDebugToggleOn()
{
List<Component> componentsWithDebugModeMember = new List<Component>();
GameObject[] allGameObjects = FindObjectsOfType<GameObject>();
foreach (GameObject gO in allGameObjects)
{
Component[] components = gO.GetComponents(typeof(Component));
foreach (Component component in components)
{
Type typeOfComponent;
typeOfComponent = component.GetType();
var f = typeOfComponent.GetField("debugMode");
if (f != null)
{
foreach (FieldInfo propBase in component.GetType().GetFields())
{
if (propBase.Name == "debugMode")
propBase.SetValue(component, true);
}
}
}
}
}
Then I can turn on only the Classes I actually need to display debug informations at the moment. Nothing fancy, but I think it may be useful for some of you out there. 🙂