155 lines
3.3 KiB
C#
155 lines
3.3 KiB
C#
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<Log> logs = new List<Log>();
|
|
|
|
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();
|
|
}
|
|
}
|
|
}
|