zoukankan      html  css  js  c++  java
  • Unity用GUI绘制Debug/print窗口/控制台-打包后测试

    Unity游戏视窗控制台输出


    本文提供全流程,中文翻译。

    Chinar 坚持将简单的生活方式,带给世人!

    (拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)


    Chinar —— 心分享、心创新!

    助力快速在 Game 视窗用 GUI 实现一个控制台的输出面板

    为新手节省宝贵的时间,避免采坑!


    Chinar 教程效果:(可打包后执行-便于调试)
    这里写图片描述



    全文高清图片,点击即可放大观看 (很多人竟然不知道)


    1

    Script —— 直接脚本挂载到空物


    将该脚本挂载空物体上,无需其他任何配置

    运行 / 打包后,按下按键 Q 即可打开 / 关闭面板

    提示:

    (可通过 Inspector 面板 ShortcutKey 属性自定义打开控制台面板的快捷键)
    举个栗子黑白88

    #define MACRO_CHINAR
    using System.Collections.Generic;
    using UnityEngine;
    
    
    
    namespace ChinarConsole
    {
        /// <summary>
        /// Chinar可视控制台
        /// </summary>
        class ChinarViewConsole : MonoBehaviour
        {
    #if MACRO_CHINAR
            struct Log
            {
                public string  Message;
                public string  StackTrace;
                public LogType LogType;
            }
    
    
            #region Inspector 面板属性
    
            [Tooltip("快捷键-开/关控制台")]  public KeyCode ShortcutKey       = KeyCode.Q;
            [Tooltip("摇动开启控制台?")]    public bool    ShakeToOpen       = true;
            [Tooltip("窗口打开加速度")]     public float   shakeAcceleration = 3f;
            [Tooltip("是否保持一定数量的日志")] public bool    restrictLogCount  = false;
            [Tooltip("最大日志数")]       public int     maxLogs           = 1000;
    
            #endregion
    
            private readonly List<Log> logs = new List<Log>();
            private          Log       log;
            private          Vector2   scrollPosition;
            private          bool      visible;
            public           bool      collapse;
    
            static readonly Dictionary<LogType, Color> logTypeColors = new Dictionary<LogType, Color>
            {
                {LogType.Assert, Color.white},
                {LogType.Error, Color.red},
                {LogType.Exception, Color.red},
                {LogType.Log, Color.white},
                {LogType.Warning, Color.yellow},
            };
    
            private const string     ChinarWindowTitle = "Chinar-控制台";
            private const int        Edge              = 20;
            readonly      GUIContent clearLabel        = new GUIContent("清空", "清空控制台内容");
            readonly      GUIContent hiddenLabel       = new GUIContent("合并信息", "隐藏重复信息");
    
            readonly Rect titleBarRect = new Rect(0, 0, 10000, 20);
            Rect          windowRect   = new Rect(Edge, Edge, Screen.width - (Edge * 2), Screen.height - (Edge * 2));
    
    
            void OnEnable()
            {
    #if UNITY_4
                Application.RegisterLogCallback(HandleLog);
    #else
                Application.logMessageReceived += HandleLog;
    #endif
            }
    
    
            void OnDisable()
            {
    #if UNITY_4
                Application.RegisterLogCallback(null);
    #else
                Application.logMessageReceived -= HandleLog;
    #endif
            }
    
    
            void Update()
            {
                if (Input.GetKeyDown(ShortcutKey)) visible                                      = !visible;
                if (ShakeToOpen && Input.acceleration.sqrMagnitude > shakeAcceleration) visible = true;
            }
    
    
            void OnGUI()
            {
                if (!visible) return;
                windowRect = GUILayout.Window(666, windowRect, DrawConsoleWindow, ChinarWindowTitle);
            }
    
    
            void DrawConsoleWindow(int windowid)
            {
                DrawLogsList();
                DrawToolbar();
                GUI.DragWindow(titleBarRect);
            }
    
    
            void DrawLogsList()
            {
                scrollPosition = GUILayout.BeginScrollView(scrollPosition);
                for (var i = 0; i < logs.Count; i++)                        
                {
                    if (collapse && i > 0) if (logs[i].Message != logs[i - 1].Message) continue; 
                    GUI.contentColor = logTypeColors[logs[i].LogType];
                    GUILayout.Label(logs[i].Message);
                }
                GUILayout.EndScrollView();     
                GUI.contentColor = Color.white; 
            }
    
    
            void DrawToolbar()
            {
                GUILayout.BeginHorizontal();
                if (GUILayout.Button(clearLabel))
                {
                    logs.Clear();
                }
    
                collapse = GUILayout.Toggle(collapse, hiddenLabel, GUILayout.ExpandWidth(false));
                GUILayout.EndHorizontal();
            }
    
    
            void HandleLog(string message, string stackTrace, LogType type)
            {
                logs.Add(new Log
                {
                    Message    = message,
                    StackTrace = stackTrace,
                    LogType    = type,
                });
                DeleteExcessLogs();
            }
    
    
            void DeleteExcessLogs()
            {
                if (!restrictLogCount) return;
                var amountToRemove = Mathf.Max(logs.Count - maxLogs, 0);
                print(amountToRemove);
                if (amountToRemove == 0)
                {
                    return;
                }
    
                logs.RemoveRange(0, amountToRemove);
            }
    #endif
        }
    }

    2


    当你的项目中有打印输出的时候,面板上会直接显示信息

    效果类似于 Unity Console 窗口
    举个栗子黑白88

            void Update()
            {
                print("Chinar-Console");
                Debug.Log("Debug.Log");
            }

    这里写图片描述


    支持

    May Be —— 搞开发,总有一天要做的事!


    拥有自己的服务器,无需再找攻略!

    Chinar 提供一站式教程,闭眼式创建!

    为新手节省宝贵时间,避免采坑!


    先点击领取 —— 阿里全产品优惠券 (享受最低优惠)


    1 —— 云服务器超全购买流程 (新手必备!)

    2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)

    3—— Windows 服务器配置、运行、建站一条龙 !

    4 —— Linux 服务器配置、运行、建站一条龙 !





    技术交流群:806091680 ! Chinar 欢迎你的加入


    END

    本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

    对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

    对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

  • 相关阅读:
    二分搜索树的深度优先遍历和广度优先遍历
    数据结构与算法之非比较排序【Java】
    数据结构与算法之比较排序【Java】
    像素 转换 px dp
    Toast
    MySQL丶auto_increment
    MariaDB · 性能优化 · Extended Keys
    加唯一索引怎么会导致丢数据
    语句执行错误一· Count(Distinct) ERROR
    innodb参数 &#183; innodb_flush_log_at_trx_commit
  • 原文地址:https://www.cnblogs.com/chinarbolg/p/9601375.html
Copyright © 2011-2022 走看看