Skip to content

Instantly share code, notes, and snippets.

@mminer
Last active March 13, 2024 17:55
Show Gist options
  • Save mminer/975374 to your computer and use it in GitHub Desktop.
Save mminer/975374 to your computer and use it in GitHub Desktop.
Unity script to display in-game debug console. Actively maintained version: https://github.com/mminer/consolation
// NOTE: For an actively-maintained version of this script, see https://github.com/mminer/consolation.
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// A console to display Unity's debug logs in-game.
/// </summary>
public class Console : MonoBehaviour
{
struct Log
{
public string message;
public string stackTrace;
public LogType type;
}
/// <summary>
/// The hotkey to show and hide the console window.
/// </summary>
public KeyCode toggleKey = KeyCode.BackQuote;
List<Log> logs = new List<Log>();
Vector2 scrollPosition;
bool show;
bool collapse;
// Visual elements:
static readonly Dictionary<LogType, Color> logTypeColors = new Dictionary<LogType, Color>()
{
{ LogType.Assert, Color.white },
{ LogType.Error, Color.red },
{ LogType.Exception, Color.red },
{ LogType.Log, Color.white },
{ LogType.Warning, Color.yellow },
};
const int margin = 20;
Rect windowRect = new Rect(margin, margin, Screen.width - (margin * 2), Screen.height - (margin * 2));
Rect titleBarRect = new Rect(0, 0, 10000, 20);
GUIContent clearLabel = new GUIContent("Clear", "Clear the contents of the console.");
GUIContent collapseLabel = new GUIContent("Collapse", "Hide repeated messages.");
void OnEnable ()
{
Application.RegisterLogCallback(HandleLog);
}
void OnDisable ()
{
Application.RegisterLogCallback(null);
}
void Update ()
{
if (Input.GetKeyDown(toggleKey)) {
show = !show;
}
}
void OnGUI ()
{
if (!show) {
return;
}
windowRect = GUILayout.Window(123456, windowRect, ConsoleWindow, "Console");
}
/// <summary>
/// A window that displayss the recorded logs.
/// </summary>
/// <param name="windowID">Window ID.</param>
void ConsoleWindow (int windowID)
{
scrollPosition = GUILayout.BeginScrollView(scrollPosition);
// Iterate through the recorded logs.
for (int i = 0; i < logs.Count; i++) {
var log = logs[i];
// Combine identical messages if collapse option is chosen.
if (collapse) {
var messageSameAsPrevious = i > 0 && log.message == logs[i - 1].message;
if (messageSameAsPrevious) {
continue;
}
}
GUI.contentColor = logTypeColors[log.type];
GUILayout.Label(log.message);
}
GUILayout.EndScrollView();
GUI.contentColor = Color.white;
GUILayout.BeginHorizontal();
if (GUILayout.Button(clearLabel)) {
logs.Clear();
}
collapse = GUILayout.Toggle(collapse, collapseLabel, GUILayout.ExpandWidth(false));
GUILayout.EndHorizontal();
// Allow the window to be dragged by its title bar.
GUI.DragWindow(titleBarRect);
}
/// <summary>
/// Records a log from the log callback.
/// </summary>
/// <param name="message">Message.</param>
/// <param name="stackTrace">Trace of where the message came from.</param>
/// <param name="type">Type of message (error, exception, warning, assert).</param>
void HandleLog (string message, string stackTrace, LogType type)
{
logs.Add(new Log() {
message = message,
stackTrace = stackTrace,
type = type,
});
}
}
@mminer
Copy link
Author

mminer commented Nov 4, 2019

@Starspangledkiwi: Take a look at the actively-maintained mminer/consolation repo. It has an updated Console.cs file which includes a font size option, among others.

@asaf-kali
Copy link

Great code.
Note to use Application.logMessageReceived += HandleLog; instead of deprecated Application.RegisterLogCallback(HandleLog);.
I used Application.logMessageReceivedThreaded because I need to see logs from multiple threads.

@mminer
Copy link
Author

mminer commented Dec 17, 2019

@asaf-kali: Good suggestion — we use Application.logMessageReceivedThreaded in mminer/consolation, which is the actively-maintained version of this script.

@hardworkerstudio
Copy link

Very nice! Thank you very much!!!

@masterchop
Copy link

Is there any chance to switch to the UI canvas version in unity?

@mminer
Copy link
Author

mminer commented Jul 18, 2021

@masterchop: You could rework this script to use UGUI, but I’d hesitate to go that route myself since I’ve started using UI Toolkit in new projects.

@masterchop
Copy link

@masterchop: You could rework this script to use UGUI, but I’d hesitate to go that route myself since I’ve started using UI Toolkit in new projects.

manage to get it working. thank for the reply.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment