-
-
Save mminer/975374 to your computer and use it in GitHub Desktop.
// 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, | |
}); | |
} | |
} |
This is a nifty piece of code, thanks. Made a fork showing how to use this in another script for anyone who's curious.
@DannyBen is correct, the script uses a callback to capture messages logged using Unity's Debug class. You shouldn't need to modify your existing code to take advantage of this.
(Also, sorry for the slow reply, GitHub doesn't notify me when a Gist is commented on.)
I love this script. thank you!
I created a full GitHub repository for the in-game console here: https://github.com/mminer/consolation. This will allow issues to be reported and contributors to create pull requests. Changes to the Console.cs script will be pushed here also though, so if you bookmarked this page it won't disappear.
This is nice. Thank you! :D
Works very well ^^
nice ,many thanks!
How enable a debug console in empires and allies?
Regards 👍
Hi, i put the code in a file and after attach in empty gameObject. But when i launch exe game i dont see the console. Where is my error?
ok, i set black toggle key. But i have a problem. My project don't run in paly mode with unity editor, run stutters. So i try code, but i have an error that i dont see that file is. Who do i do?
i try with exe
ok, i find the option to set with i create exe file. Sorry for disturb
thx, nice piece of code
Great script thank you!
how to make it persist on every scene?
Question, how to you change the font size? The text when the console comes up is a little too small for what I am running.
@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.
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.
@asaf-kali: Good suggestion — we use Application.logMessageReceivedThreaded
in mminer/consolation, which is the actively-maintained version of this script.
Very nice! Thank you very much!!!
Is there any chance to switch to the UI canvas version in unity?
@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: 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.
This is awesome. I'm using Console.Print(), but I believe any debug message can print to the console.