| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | // People should be able to see and report errors to the developer very easily.//// Unity's Developer Console only works in development builds and it only shows// errors. This class provides a console that works in all builds and also shows// log and warnings in development builds.//// Note: we don't include the stack trace, because that can also be grabbed from// the log files if needed.//// Note: there is no 'hide' button because we DO want people to see those errors// and report them back to us.//// Note: normal Debug.Log messages can be shown by building in Debug/Development//       mode.using UnityEngine;using System.Collections.Generic;namespace Mirror{    struct LogEntry    {        public string message;        public LogType type;        public LogEntry(string message, LogType type)        {            this.message = message;            this.type = type;        }    }    public class GUIConsole : MonoBehaviour    {        public int height = 150;        // only keep the recent 'n' entries. otherwise memory would grow forever        // and drawing would get slower and slower.        public int maxLogCount = 50;        // log as queue so we can remove the first entry easily        Queue<LogEntry> log = new Queue<LogEntry>();        // hotkey to show/hide at runtime for easier debugging        // (sometimes we need to temporarily hide/show it)        // => F12 makes sense. nobody can find ^ in other games.        public KeyCode hotKey = KeyCode.F12;        // GUI        bool visible;        Vector2 scroll = Vector2.zero;        void Awake()        {            Application.logMessageReceived += OnLog;        }        // OnLog logs everything, even Debug.Log messages in release builds        // => this makes a lot of things easier. e.g. addon initialization logs.        // => it's really better to have than not to have those        void OnLog(string message, string stackTrace, LogType type)        {            // is this important?            bool isImportant = type == LogType.Error || type == LogType.Exception;            // use stack trace only if important            // (otherwise users would have to find and search the log file.            //  seeing it in the console directly is way easier to deal with.)            // => only add \n if stack trace is available (only in debug builds)            if (isImportant && !string.IsNullOrWhiteSpace(stackTrace))                message += "\n" + stackTrace;            // add to queue            log.Enqueue(new LogEntry(message, type));            // respect max entries            if (log.Count > maxLogCount)                log.Dequeue();            // become visible if it was important            // (no need to become visible for regular log. let the user decide.)            if (isImportant)                visible = true;            // auto scroll            scroll.y = float.MaxValue;        }        void Update()        {            if (Input.GetKeyDown(hotKey))                visible = !visible;        }        void OnGUI()        {            if (!visible) return;            scroll = GUILayout.BeginScrollView(scroll, "Box", GUILayout.Width(Screen.width), GUILayout.Height(height));            foreach (LogEntry entry in log)            {                if (entry.type == LogType.Error || entry.type == LogType.Exception)                    GUI.color = Color.red;                else if (entry.type == LogType.Warning)                    GUI.color = Color.yellow;                GUILayout.Label(entry.message);                GUI.color = Color.white;            }            GUILayout.EndScrollView();        }    }}
 |