using System.Collections.Generic; using UnityEngine; #if ENABLE_INPUT_SYSTEM using UnityEngine.InputSystem; #endif public class vDebugUtils : MonoBehaviour { [Tooltip("Enable the debug hotkeys and IMGUI overlay. Keep disabled outside diagnostic sessions to avoid IMGUI overhead.")] public bool enableDebugUtility; public KeyCode timeScaleDown = KeyCode.KeypadMinus, timeScaleUp = KeyCode.KeypadPlus; public float timeScaleChangeValue = 0.1f; public bool affectFixedDeltaTime = true; float currentFixedDeltaTime; List debugMessages = new List(); public float displayMessageTime = 5f; enum MessageType { Normal, Warning, Error } class DebugMessage { public string message; public float startTime; public float duration; public string timeString; public MessageType messageType; public DebugMessage(string message, float startTime, float duration, MessageType messageType) { this.message = message; this.startTime = startTime; this.messageType = messageType; this.duration = duration; timeString = System.DateTime.Now.ToString(@"HH\:mm\:ss"); } public bool isAlive => startTime + duration > Time.time; } private void Awake() { if (!enableDebugUtility) { enabled = false; } } private void OnEnable() { currentFixedDeltaTime = Time.fixedDeltaTime; } private void Update() { var scaleDownPressed = false; var scaleUpPressed = false; #if ENABLE_LEGACY_INPUT_MANAGER scaleDownPressed = Input.GetKeyDown(timeScaleDown); scaleUpPressed = Input.GetKeyDown(timeScaleUp); #elif ENABLE_INPUT_SYSTEM scaleDownPressed = Keyboard.current != null && Keyboard.current.numpadMinusKey.wasPressedThisFrame; scaleUpPressed = Keyboard.current != null && Keyboard.current.numpadPlusKey.wasPressedThisFrame; #endif if (scaleDownPressed) { Time.timeScale = Mathf.Clamp(Time.timeScale - timeScaleChangeValue, 0, 1f); if (affectFixedDeltaTime) { Time.fixedDeltaTime = Time.timeScale * currentFixedDeltaTime; } } else if (scaleUpPressed) { Time.timeScale = Mathf.Clamp(Time.timeScale + timeScaleChangeValue, 0, 1f); if (affectFixedDeltaTime) { Time.fixedDeltaTime = Time.timeScale * currentFixedDeltaTime; } } } public void PrintMessage(string message) { Debug.Log(message); debugMessages.Add(new DebugMessage(message, Time.time, displayMessageTime, MessageType.Normal)); scrool.y = lastRectPosition; } public void PrintMessageWarning(string message) { Debug.LogWarning(message); debugMessages.Add(new DebugMessage(message, Time.time, displayMessageTime, MessageType.Warning)); scrool.y = lastRectPosition; } public void PrintMessageError(string message) { Debug.LogError(message); debugMessages.Add(new DebugMessage(message, Time.time, displayMessageTime, MessageType.Error)); scrool.y = lastRectPosition; } Vector2 scrool; GUIStyle messageStyle; readonly GUIContent timeScaleContent = new GUIContent(); float displayedTimeScale = float.NaN; float lastRectPosition; private void OnGUI() { if (!Mathf.Approximately(displayedTimeScale, Time.timeScale)) { displayedTimeScale = Time.timeScale; timeScaleContent.text = "TimeScale:" + Time.timeScale; } GUILayout.Label(timeScaleContent); if (debugMessages.Count > 0) { if (messageStyle == null) { messageStyle = new GUIStyle(GUI.skin.box); messageStyle.wordWrap = true; messageStyle.alignment = TextAnchor.MiddleLeft; messageStyle.fontSize = 10; } scrool = GUILayout.BeginScrollView(scrool, "box", GUILayout.MinHeight(100), GUILayout.Width(Screen.width * 0.2f), GUILayout.MaxHeight(Screen.height * 0.8f)); for (int i = 0; i < debugMessages.Count; i++) { var m = debugMessages[i]; if (m.isAlive) { var t = m.messageType; GUI.color = t == MessageType.Warning ? Color.yellow : t == MessageType.Error ? Color.red : Color.white; GUILayout.Label(string.Format("[{0}] : {1}", m.timeString, m.message), messageStyle); lastRectPosition = GUILayoutUtility.GetLastRect().y; } else { debugMessages.RemoveAt(i); i--; } } GUILayout.EndScrollView(); } } }