using System.Collections; using System.Collections.Generic; using UnityEngine; public class Logger : MonoBehaviour { [Range(1, 5)] public float duration = 3.0f; public Color color = Color.white; List> log_history = new List>(); List out_of_date; GUIStyle style; float line_height; public float updateInterval = 0.1f; private double lastInterval; private int frames = 0; private float currFPS; private bool viewFPS = true; public bool enableFPS { set{ viewFPS = !viewFPS; } get{ return viewFPS; } } private void Start() { log_history = new List>(); out_of_date = new List(); style = new GUIStyle(); lastInterval = Time.realtimeSinceStartup; frames = 0; } private void Update() { line_height = Screen.height * 0.05f; style.fontSize = (int)line_height; out_of_date.Clear(); for (int i = log_history.Count - 1; i >= 0; i--) { if (Time.time - log_history[i].Value > duration) out_of_date.Add(i); } foreach (var i in out_of_date) { log_history.RemoveAt(i); } CountFPS(); } void OnEnable() { Application.logMessageReceived += HandleLog; } void OnDisable() { Application.logMessageReceived -= HandleLog; } void HandleLog(string logString, string stackTrace, LogType type) { if(log_history == null || logString == null) { Debug.Log(""); } log_history.Add(new KeyValuePair(logString, Time.time)); } void CountFPS() { ++frames; float timeNow = Time.realtimeSinceStartup; if (timeNow > lastInterval + updateInterval) { currFPS = (float)(frames / (timeNow - lastInterval)); frames = 0; lastInterval = timeNow; } } void OnGUI() { //if (GUI.Button(new Rect(10, 10, 150, 100), "I am a button")) //print("You clicked the button!"); float offset = 15.0f; Rect position = new Rect(offset, Screen.height - line_height * 2.0f, Screen.width - offset * 2.0f, line_height); if (viewFPS) { style.normal.textColor = new Color(color.r, color.g, color.b, 1); GUI.Label(position, string.Format("fps: {0}", currFPS.ToString("f2")), style); position.y = position.y - line_height; } for (int i = log_history.Count - 1; i >= 0; i--) { var ls = log_history[i]; float a = 1.0f - Mathf.Pow((Time.time - ls.Value) / duration, 2.2f); style.normal.textColor = new Color(color.r, color.g, color.b, a); GUI.Label(position, ls.Key + string.Format(" {0}", Time.time - ls.Value), style); position.y = position.y - line_height; } } }