Unity用GUI绘制Debug/print窗口/控制台-打包后测试

摘要:
Unity游戏窗口控制台输出本文提供了整个过程,中文翻译。中国坚持为世界带来简单的生活方式!中文教程效果:1Script——将脚本直接附加到空对象2Print/Debug——打印输出支持MayBe——做开发,总有一天会完成的!全文高清图片,单击放大并观看1Script--将脚本直接附加到空对象,然后将脚本装载到空对象上,无需任何其他配置。运行/打包后,按Q键打开/关闭面板提示:#defineMACRO_CHINARusingSystem.Collections。通用的使用UnityEngine;NamespaceChinaConsole{/////<summary>/////China Visual Console///</summary>classChinaViewConsole:MonoBehavior{#ifMACRO_CHINARstructLog{publicstringMessage;publicstringStackTrace;publicLogTypeLogType;}#RegionInspector面板属性[Tooltip]publicKeyCodeShortcutKey=KeyCode。Q[工具提示(“摇动以打开控制台?

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

Print / Debug —— 打印输出


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

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

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

这里写图片描述


支持

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


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

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

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


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


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

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

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

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



Unity用GUI绘制Debug/print窗口/控制台-打包后测试第5张

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


END

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

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

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

免责声明:文章转载自《Unity用GUI绘制Debug/print窗口/控制台-打包后测试》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Nodejs 实现ESL内联FreeSWITCH设定说明博客园入园手册1——TinyMEC编辑器下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Mac下发布Unity3d中Android平台下出现“android (invokation failed)”的错误

 昨天想要给Murphy同学编译一个Andorid版本的工程,但我本机没有Android SDK,于是安装了Murphy发给我的安装包,并升级设置,结果在发布的最后出现了如下错误: Error building Player: Exception: android (invokation failed)ERROR: unknown errorcmd:an...

Android全局桌面宠物 Unity方案实现

转载:https://blog.csdn.net/xssdmx/article/details/107315493 Android全局桌面宠物 Unity方案实现 最近接到一个任务是Android设备上实现一个全局的指引动画,开始想着就用普通动画控件或者svga、lottie控件实现,最近正好在学习Unity,所以试着用unity实现。经过三天努力,居...

idea 中main 方法不能运行

在用idea建立工程的时候有时候会发现main 方法不能运行 然后百思不得其解 控制台会报错: 翻译过来就是依赖出错 这时候我们就要改idea配置 我们要修改Working directory变为我们工程在的绝对路径(一开始你会发现只有一个工程名) 改过之后应用后main 就可以运行了...

【Unity Shader学习笔记】(一)在表面着色器中控制顶点变换

通常境况下,我们可以方便地使用表面着色器对材质进行简单的金属光泽、平滑度等设置。但是如果要想对顶点进行控制,就需要使用顶点片段着色器。然而,在顶点片段着色器中,连最基本的漫反射、高光等都需要手动去写,显然比较麻烦。因此,如果能在表面着色器中进行顶点的控制就好了。 当然,这是可以做到的! 首先,在Unity中生成一个基本的表面着色器,在Project选项卡...

ARKit 研究笔记一

软件需求:Xcode9.x 、blender 硬件需求:iphone 6s + 系统:iOS 11 + 技能储备: ARKit 、SceneKit(苹果提供的3d游戏库) 或 SpriteKit(苹果提供的2d游戏库) 搞ARKit 不仅仅需要了解ARKit,还得专研SceneKit 或是SpriteKit。在国内 基本上都是用cocos2d-x 或是 U...

Python GUI工具Tkinter以及拖拉工具Page安装

如果使用Tkinter作为Python GUI工具,我们需要安装Tkinter,这个使用conda或者pip即可:  conda install -c anaconda tk  为了提高界面编写效率,可以使用拖拉工具Page: 下载地址:https://sourceforge.net/projects/page/ 安装完成后可能会遇到can't find...