An even simpler way to do it.
Just attach this script to any scene gameObject:
This works perfectly with ANY build (debug, production) and ANY platform.
It shows EXACTLY what you would see on the console (Debug.Log, Debug.Error, errors, crashes etc)
using UnityEngine;
namespace DebugStuff
{
public class ConsoleToGUI : MonoBehaviour
{
//#if !UNITY_EDITOR
static string myLog = "";
private string output;
private string stack;
void OnEnable()
{
Application.logMessageReceived += Log;
}
void OnDisable()
{
Application.logMessageReceived -= Log;
}
public void Log(string logString, string stackTrace, LogType type)
{
output = logString;
stack = stackTrace;
myLog = output + "
" + myLog;
if (myLog.Length > 5000)
{
myLog = myLog.Substring(0, 4000);
}
}
void OnGUI()
{
//if (!Application.isEditor) //Do not display in editor ( or you can use the UNITY_EDITOR macro to also disable the rest)
{
myLog = GUI.TextArea(new Rect(10, 10, Screen.width - 10, Screen.height - 10), myLog);
}
}
//#endif
}
}
Here’s another version in which you can
toggle with the space bar
it also creates a full log file anywhere you want (in the example, on the desktop)
it “corrects” the simple GUI window so the text size is always readable on all screens and all platforms
using UnityEngine;
public class ConsoleToGUI : MonoBehaviour
{
string myLog = "*begin log";
string filename = "";
bool doShow = true;
int kChars = 700;
void OnEnable() { Application.logMessageReceived += Log; }
void OnDisable() { Application.logMessageReceived -= Log; }
void Update() { if (Input.GetKeyDown(KeyCode.Space)) { doShow = !doShow; } }
public void Log(string logString, string stackTrace, LogType type)
{
// for onscreen...
myLog = myLog + "
" + logString;
if (myLog.Length > kChars) { myLog = myLog.Substring(myLog.Length - kChars); }
// for the file ...
if (filename == "")
{
string d = System.Environment.GetFolderPath(
System.Environment.SpecialFolder.Desktop) + "/YOUR_LOGS";
System.IO.Directory.CreateDirectory(d);
string r = Random.Range(1000, 9999).ToString();
filename = d + "/log-" + r + ".txt";
}
try { System.IO.File.AppendAllText(filename, logString + "
"); }
catch { }
}
void OnGUI()
{
if (!doShow) { return; }
GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity,
new Vector3(Screen.width / 1200.0f, Screen.height / 800.0f, 1.0f));
GUI.TextArea(new Rect(10, 10, 540, 370), myLog);
}
}
Obviously, if you prefer to use Unity.UI rather than the legacy “GUI”, it is completely trivial to write it to a UI.Text in your Canvas.