using System.Collections.Generic; using UnityEngine; namespace BitStrap { public class RuntimeConsole : MonoBehaviour { private struct Log { public LogType logType; public string message; public string stackTrace; public bool AsGUI(bool showLog, bool showWarning, bool showError) { switch (logType) { case LogType.Error: case LogType.Assert: case LogType.Exception: if (!showError) { return false; } GUI.color = Color.red; break; case LogType.Warning: if (!showWarning) { return false; } GUI.color = Color.yellow; break; case LogType.Log: if (!showLog) { return false; } GUI.color = Color.white; break; } bool result = GUILayout.Button("> " + message, GUI.skin.label); GUI.color = Color.white; return result; } } public int maxLogs = 100; private List logs = new List(); private int selectedLog = -1; private Vector2 scroll = Vector2.zero; private Vector2 stackTraceScroll = Vector2.zero; private bool showLog = true; private bool showWarning; private bool showError = true; private GUIStyle windowStyle; private void Awake() { if (base.enabled) { Application.logMessageReceived += AddMessage; } } private void TryAdjustWindowBgColor() { if (windowStyle == null) { windowStyle = new GUIStyle(GUI.skin.window); int num = 4; int num2 = 4; Texture2D texture2D = new Texture2D(num, num2); Color[] array = new Color[num * num2]; for (int i = 0; i < array.Length; i++) { array[i] = new Color(0f, 0f, 0f, 0.8f); } texture2D.SetPixels(array); texture2D.Apply(); windowStyle.normal.background = texture2D; } } private void AddMessage(string message, string stackTrace, LogType logType) { if (base.enabled) { Log item = new Log { logType = logType, message = message, stackTrace = stackTrace }; logs.Insert(logs.Count, item); if (logs.Count > maxLogs && maxLogs > 0) { logs.RemoveAt(0); } } } private void OnGUI() { TryAdjustWindowBgColor(); if (!Input.GetKey(KeyCode.LeftShift) || !Input.GetKey(KeyCode.C)) { return; } Rect screenRect = new Rect(0f, 0f, Screen.width, Screen.height); GUILayout.BeginArea(screenRect, windowStyle); GUILayout.BeginHorizontal(); GUILayout.Label("LOGS"); GUILayout.FlexibleSpace(); showLog = GUILayout.Toggle(showLog, "Log", GUI.skin.button); showWarning = GUILayout.Toggle(showWarning, "Warning", GUI.skin.button); showError = GUILayout.Toggle(showError, "Error", GUI.skin.button); if (GUILayout.Button("Clear")) { logs.Clear(); selectedLog = -1; } GUILayout.EndHorizontal(); scroll = GUILayout.BeginScrollView(scroll); for (int i = 0; i < logs.Count; i++) { if (logs[i].AsGUI(showLog, showWarning, showError)) { selectedLog = i; } } GUILayout.FlexibleSpace(); GUILayout.EndScrollView(); if (selectedLog >= 0) { GUILayout.Label("-------------------------------------------------------------------------"); stackTraceScroll = GUILayout.BeginScrollView(stackTraceScroll, GUILayout.Height(128f)); GUILayout.Label(logs[selectedLog].stackTrace); GUILayout.EndScrollView(); } GUILayout.EndArea(); } } }