hellbound/Assets/Sources/Feel/MMTools/Tools/MMHelpers/MMConsole.cs

107 lines
3.4 KiB
C#

using UnityEngine;
using System.Collections;
namespace MoreMountains.Tools
{
/// <summary>
/// This class displays an on-screen console for easier debugging
/// DO NOT ADD THIS CLASS AS A COMPONENT.
/// Instead, use the MMDebug.DebugOnScreen methods that will take care of everything
/// </summary>
public class MMConsole : MonoBehaviour
{
protected string _messageStack;
protected int _numberOfMessages=0;
protected bool _messageStackHasBeenDisplayed=false;
protected int _largestMessageLength=0;
protected int _marginTop = 10;
protected int _marginLeft = 10;
protected int _padding = 10;
protected int _fontSize = 10;
protected int _characterHeight = 16;
protected int _characterWidth = 6;
/// <summary>
/// Draws a box containing the current stack of messages on top of the screen.
/// </summary>
protected virtual void OnGUI()
{
// we define the style to use and the font size
GUIStyle style = GUI.skin.GetStyle ("label");
style.fontSize = _fontSize;
// we determine our box dimension based on the number of lines and the length of the longest line
int boxHeight = _numberOfMessages*_characterHeight;
int boxWidth = _largestMessageLength * _characterWidth;
// we draw a box and the message on top of it
GUI.Box (new Rect (_marginLeft,_marginTop,boxWidth+_padding*2,boxHeight+_padding*2), "");
GUI.Label(new Rect(_marginLeft+_padding, _marginTop+_padding, boxWidth, boxHeight), _messageStack);
// we set our flag to true, which will trigger the reset of the stack next time it's accessed
_messageStackHasBeenDisplayed=true;
}
/// <summary>
/// Sets the size of the font, and automatically deduces the character's height and width.
/// </summary>
/// <param name="fontSize">Font size.</param>
public virtual void SetFontSize(int fontSize)
{
_fontSize = fontSize;
_characterHeight = (int)Mathf.Round(1.6f * fontSize + 0.49f);
_characterWidth = (int)Mathf.Round(0.6f * fontSize + 0.49f);
}
/// <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)
{
_marginTop = top;
_marginLeft = 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)
{
_messageStack=newMessage;
_numberOfMessages=1;
}
/// <summary>
/// Adds the specified message to the message stack.
/// </summary>
/// <param name="newMessage">New message.</param>
public virtual void AddMessage(string newMessage)
{
// if the message stack has been displayed, we empty it and reset our counters
if (_messageStackHasBeenDisplayed)
{
_messageStack="";
_messageStackHasBeenDisplayed=false;
_numberOfMessages=0;
_largestMessageLength=0;
}
// we add the specified message to the stack
_messageStack += newMessage+"\n";
// if this new message is longer than our previous longer message, we store it (this will expand the box's width
if (newMessage.Length > _largestMessageLength)
{
_largestMessageLength = newMessage.Length;
}
// we increment our counter
_numberOfMessages++;
}
}
}