Unity打包后运行调出控制台面板

1、在场景中创建一个空物体;

2、将“ChinarViewConsole”类挂载到空物体上,直接复制下面代码

#define MACRO_CHINAR
using System.Collections.Generic;
using UnityEngine;



    /// <summary>
    /// Chinar可视控制台
    /// </summary>
    public class ChinarViewConsole : MonoBehaviour
    {
#if MACRO_CHINAR
        struct Log
        {
            public string Message;
            public string StackTrace;
            public LogType LogType;
        }


    #region Inspector 面板属性

        [Tooltip("快捷键-开/关控制台")] public KeyCode ShortcutKey = KeyCode.BackQuote;
        [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;

        public bool showOnAwake = true;

        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));

        private void Awake()
        {
            if (showOnAwake)
            {
                visible = true;
            }
        }

        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)) { 
        
            }
            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
    }

运行后直接按快捷键“~”即可调出控制面板查看运行日志。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 对于优化 Unity 打包的 WebGL 的卡顿问题,可以尝试以下几种方法: 1. 减少网页的内容和资源大小,可以使用图片压缩、资源压缩等方式来减小网页的大小。 2. 减少 WebGL 渲染的复杂度,可以尝试简化模型、减少纹理的大小、减少灯光的数量等。 3. 使用合适的浏览器和设备,不同的浏览器和设备对 WebGL 的支持程度和效果都有所不同,因此选择适合的浏览器和设备可以有效地优化性能。 4. 调整 Unity 的设置,比如减少渲染帧率、调整 Quality Settings 等。 希望这些方法能够帮助你解决卡顿问题。 ### 回答2: Unity 打包 WebGL 运行卡顿是由于性能不足引起的,可以采取以下措施来优化: 1. 减少三维模型和纹理的数量和大小:大量使用高分辨率的模型和纹理会增加网页加载时间和渲染负荷。可以优化模型和纹理的分辨率,减少使用复杂的模型和减小纹理的尺寸,以降低资源消耗和提高性能。 2. 合并网格和减少渲染批次:通过将多个物体合并成一个网格,可以减少渲染调用,减少渲染批次,从而提高性能。可以使用Unity的网格合并功能来合并网格。同时,还可以使用批处理技术将具有相同材质的物体合并到一个批次中。 3. 减少动画和粒子效果:过多和复杂的动画和粒子效果会消耗大量的计算资源和内存,导致性能下降。可以减少或简化动画和粒子效果的数量和复杂度,以改善性能。 4. 使用低多边形模型和简化碰撞体:高多边形模型和复杂的碰撞体会增加渲染和碰撞检测的计算量,导致性能下降。可以使用低多边形模型来代替高多边形模型,并使用简化的碰撞体来加速碰撞检测。 5. 异步加载资源:将资源的加载和初始化分散到多个帧中进行,以避免一次性加载过多资源导致卡顿。可以使用Unity的异步加载资源的功能来实现。 6. 使用LOD(层次细节)技术:通过使用不同层次的细节模型,根据距离将更高细节的模型替换为更低细节的模型,可以减少渲染负荷,提高性能。 7. 编写高效的脚本和代码:避免使用复杂和低效的脚本和代码,优化关键路径的性能,避免频繁的内存分配和垃圾回收。 8. 使用GPU实例化:使用Unity的GPU实例化功能来复制和渲染大量相同或相似的物体,以提高渲染性能。 通过以上优化措施,可以减少资源消耗、提高渲染性能,从而解决Unity打包WebGL运行卡顿的问题。 ### 回答3: Unity打包WebGL运行卡顿的原因可能有很多,以下是一些优化建议: 1. 减少包的大小:首先,要确保你的资源文件合理压缩,不要包含过多的无用资源。可以使用压缩的图片格式,限制纹理的大小,移除不必要的模型和音频等。 2. 降低渲染负荷:Unity中的多个物体和效果绘制会增加渲染负荷。可以尝试优化物体的数量和复杂性,减少特效的使用等。 3. 使用合理的光照与阴影:光照和阴影是游戏中产生高额渲染开销的因素之一。可以降低光照和阴影的质量,或者使用更轻量级的光照模型,如平行光。 4. 合理优化脚本和代码:检查你的脚本和代码,尽量避免使用耗时的操作,如频繁的循环,频繁的内存分配等。可以使用Unity Profiler工具来分析和优化性能。 5. 合理设置物理引擎:物理引擎可以导致额外的计算开销。如果游戏中没有必要的物理模拟,可以禁用物理引擎或减少物理引擎的计算步长。 6. 打包设置优化:在Unity打包设置中,可以根据具体需求调整WebGL的压缩和优化设置,如物理内存大小、压缩选项等。 7. 平台适配:尽可能在WebGL平台上测试和优化你的游戏,确保它在WebGL上运行得更流畅。在开发过程中,可以使用真机测试来评估性能表现。 总的来说,优化WebGL性能是一个综合性的工作,需要考虑多个因素。通过以上的方法和工具,可以逐步提高游戏在WebGL平台上的运行效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小目标一个亿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值