169 lines
5.6 KiB
C#
169 lines
5.6 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
namespace MoreMountains.Tools
|
|
{
|
|
public class MMDebugOnScreenConsole : MonoBehaviour
|
|
{
|
|
[Header("Bindings")]
|
|
public RectTransform Container;
|
|
public Image BackgroundImage;
|
|
public Text ConsoleText;
|
|
|
|
[Header("Label")]
|
|
public Color LabelColor = Color.white;
|
|
|
|
[Header("Value")]
|
|
public string ValueColor = "#FFC400";
|
|
public float ValueSizeRatio = 1.35f;
|
|
|
|
protected RectTransform _rectTransform;
|
|
|
|
protected int _numberOfMessages = 0;
|
|
protected bool _messageStackHasBeenDisplayed = false;
|
|
protected bool _newMessageThisFrame = false;
|
|
protected int _largestMessageLength = 0;
|
|
protected StringBuilder _stringBuilder;
|
|
|
|
protected string _valueTagStart;
|
|
protected string _valueTagEnd;
|
|
protected const string space = " ";
|
|
|
|
protected Vector2 _closedSize = new Vector2(60, 80);
|
|
protected Vector2 _openBackgroundWidth;
|
|
protected int _last_append_at_frame = -1;
|
|
|
|
public virtual void Toggle()
|
|
{
|
|
if (ConsoleText.enabled)
|
|
{
|
|
_openBackgroundWidth = BackgroundImage.rectTransform.sizeDelta;
|
|
BackgroundImage.rectTransform.sizeDelta = _closedSize;
|
|
}
|
|
else
|
|
{
|
|
BackgroundImage.rectTransform.sizeDelta = _openBackgroundWidth;
|
|
}
|
|
ConsoleText.enabled = !ConsoleText.isActiveAndEnabled;
|
|
}
|
|
|
|
protected virtual void Awake()
|
|
{
|
|
Initialization();
|
|
}
|
|
|
|
protected virtual void Initialization()
|
|
{
|
|
ConsoleText.color = LabelColor;
|
|
_stringBuilder = new StringBuilder();
|
|
_rectTransform = this.gameObject.GetComponent<RectTransform>();
|
|
|
|
_valueTagEnd = "</size></color>";
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sets the size of the font, and automatically deduces the character's height and width.
|
|
/// </summary>
|
|
/// <param name="fontSize">Font size.</param>
|
|
protected virtual void SetFontSize(int fontSize)
|
|
{
|
|
if (fontSize == ConsoleText.fontSize)
|
|
{
|
|
return;
|
|
}
|
|
ConsoleText.fontSize = fontSize;
|
|
_valueTagStart = "<color=" + ValueColor + "><size=" + (ConsoleText.fontSize * ValueSizeRatio) + ">";
|
|
}
|
|
|
|
/// <summary>
|
|
/// Draws a box containing the current stack of messages on top of the screen.
|
|
/// </summary>
|
|
protected virtual void LateUpdate()
|
|
{
|
|
// we set our flag to true, which will trigger the reset of the stack next time it's accessed
|
|
_messageStackHasBeenDisplayed = true;
|
|
if (!_newMessageThisFrame && ConsoleText.isActiveAndEnabled)
|
|
{
|
|
this.gameObject.SetActive(false);
|
|
}
|
|
_newMessageThisFrame = false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sets the screen offset, from the top left corner
|
|
/// </summary>
|
|
/// <param name="top"></param>
|
|
/// <param name="left"></param>
|
|
public virtual void SetScreenOffset(int top = 10, int left = 10)
|
|
{
|
|
Container.MMSetTop(top);
|
|
Container.MMSetLeft(left);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Replaces the content of the current message stack with the specified string
|
|
/// </summary>
|
|
/// <param name="newMessage">New message.</param>
|
|
public virtual void SetMessage(string newMessage)
|
|
{
|
|
AddMessage(newMessage, "", 30);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Adds the specified message to the message stack.
|
|
/// </summary>
|
|
/// <param name="label">New message.</param>
|
|
public virtual void AddMessage(string label, object value, int fontSize)
|
|
{
|
|
if (!this.gameObject.activeInHierarchy)
|
|
{
|
|
this.gameObject.SetActive(true);
|
|
}
|
|
|
|
int frame = Time.frameCount;
|
|
|
|
if (!ConsoleText.isActiveAndEnabled)
|
|
{
|
|
return;
|
|
}
|
|
_newMessageThisFrame = true;
|
|
SetFontSize(fontSize);
|
|
|
|
// if the message stack has been displayed, we empty it and reset our counters
|
|
if (_last_append_at_frame != frame)
|
|
{
|
|
_stringBuilder.Clear();
|
|
_messageStackHasBeenDisplayed = false;
|
|
_numberOfMessages = 0;
|
|
_largestMessageLength = 0;
|
|
}
|
|
|
|
_last_append_at_frame = Time.frameCount;
|
|
|
|
// we add the specified message to the stack
|
|
if (_stringBuilder.Length != 0)
|
|
{
|
|
_stringBuilder.Append(System.Environment.NewLine);
|
|
}
|
|
_stringBuilder.Append(label.ToUpper());
|
|
_stringBuilder.Append(space);
|
|
_stringBuilder.Append(_valueTagStart);
|
|
_stringBuilder.Append(value);
|
|
_stringBuilder.Append(_valueTagEnd);
|
|
// if this new message is longer than our previous longer message, we store it (this will expand the box's width
|
|
if (label.Length > _largestMessageLength)
|
|
{
|
|
_largestMessageLength = label.Length;
|
|
}
|
|
// we increment our counter
|
|
_numberOfMessages++;
|
|
|
|
ConsoleText.text = _stringBuilder.ToString();
|
|
}
|
|
}
|
|
}
|
|
|