// Console Viewer Canvas|Prefabs|0020
|
|
namespace VRTK
|
|
{
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using System.Collections.Generic;
|
|
using System.Text.RegularExpressions;
|
|
using System.Linq;
|
|
|
|
/// <summary>
|
|
/// Adds an in-scene representation of the Unity console on a world space canvas.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// **Prefab Usage:**
|
|
/// * Place the `VRTK/Prefabs/ConsoleViewerCanvas/ConsoleViewerCanvas` prefab into the scene hierarchy.
|
|
///
|
|
/// > It is also possible to interact with the `ConsoleViewerCanvas` with a `VRTK_UIPointer`.
|
|
/// </remarks>
|
|
public class VRTK_ConsoleViewer : MonoBehaviour
|
|
{
|
|
[Tooltip("The size of the font the log text is displayed in.")]
|
|
public int fontSize = 14;
|
|
[Tooltip("The colour of the text for an info log message.")]
|
|
public Color infoMessage = Color.black;
|
|
[Tooltip("The colour of the text for an assertion log message.")]
|
|
public Color assertMessage = Color.black;
|
|
[Tooltip("The colour of the text for a warning log message.")]
|
|
public Color warningMessage = Color.yellow;
|
|
[Tooltip("The colour of the text for an error log message.")]
|
|
public Color errorMessage = Color.red;
|
|
[Tooltip("The colour of the text for an exception log message.")]
|
|
public Color exceptionMessage = Color.red;
|
|
|
|
protected Dictionary<LogType, Color> logTypeColors;
|
|
protected ScrollRect scrollWindow;
|
|
protected RectTransform consoleRect;
|
|
protected Text consoleOutput;
|
|
protected const string NEWLINE = "\n";
|
|
protected int lineBuffer = 50;
|
|
protected int currentBuffer;
|
|
protected string lastMessage;
|
|
protected bool collapseLog = false;
|
|
|
|
/// <summary>
|
|
/// The SetCollapse method determines whether the console will collapse same message output into the same line. A state of `true` will collapse messages and `false` will print the same message for each line.
|
|
/// </summary>
|
|
/// <param name="state">The state of whether to collapse the output messages, true will collapse and false will not collapse.</param>
|
|
public virtual void SetCollapse(bool state)
|
|
{
|
|
collapseLog = state;
|
|
}
|
|
|
|
/// <summary>
|
|
/// The ClearLog method clears the current log view of all messages
|
|
/// </summary>
|
|
public virtual void ClearLog()
|
|
{
|
|
consoleOutput.text = "";
|
|
currentBuffer = 0;
|
|
lastMessage = "";
|
|
}
|
|
|
|
protected virtual void Awake()
|
|
{
|
|
logTypeColors = new Dictionary<LogType, Color>()
|
|
{
|
|
{ LogType.Assert, assertMessage },
|
|
{ LogType.Error, errorMessage },
|
|
{ LogType.Exception, exceptionMessage },
|
|
{ LogType.Log, infoMessage },
|
|
{ LogType.Warning, warningMessage }
|
|
};
|
|
scrollWindow = transform.Find("Panel/Scroll View").GetComponent<ScrollRect>();
|
|
consoleRect = transform.Find("Panel/Scroll View/Viewport/Content").GetComponent<RectTransform>();
|
|
consoleOutput = transform.Find("Panel/Scroll View/Viewport/Content/ConsoleOutput").GetComponent<Text>();
|
|
|
|
consoleOutput.fontSize = fontSize;
|
|
ClearLog();
|
|
}
|
|
|
|
protected virtual void OnEnable()
|
|
{
|
|
Application.logMessageReceived += HandleLog;
|
|
}
|
|
|
|
protected virtual void OnDisable()
|
|
{
|
|
Application.logMessageReceived -= HandleLog;
|
|
consoleRect.sizeDelta = Vector2.zero;
|
|
}
|
|
|
|
protected virtual string GetMessage(string message, LogType type)
|
|
{
|
|
string color = ColorUtility.ToHtmlStringRGBA(logTypeColors[type]);
|
|
return "<color=#" + color + ">" + message + "</color>" + NEWLINE;
|
|
}
|
|
|
|
protected virtual void HandleLog(string message, string stackTrace, LogType type)
|
|
{
|
|
string logOutput = GetMessage(message, type);
|
|
|
|
if (!collapseLog || lastMessage != logOutput)
|
|
{
|
|
consoleOutput.text += logOutput;
|
|
lastMessage = logOutput;
|
|
}
|
|
|
|
consoleRect.sizeDelta = new Vector2(consoleOutput.preferredWidth, consoleOutput.preferredHeight);
|
|
scrollWindow.verticalNormalizedPosition = 0;
|
|
currentBuffer++;
|
|
if (currentBuffer >= lineBuffer)
|
|
{
|
|
IEnumerable<string> lines = Regex.Split(consoleOutput.text, NEWLINE).Skip(lineBuffer / 2);
|
|
consoleOutput.text = string.Join(NEWLINE, lines.ToArray());
|
|
currentBuffer = lineBuffer / 2;
|
|
}
|
|
}
|
|
}
|
|
}
|