Unity 微型调试器 Debugger
来源:互联网 发布:网络nat类型 编辑:程序博客网 时间:2024/04/30 05:30
在任意物体上挂载调试器脚本Debugger,勾选AllowDebugging开启调试,游戏启动后便会在左上角显示一个可拖动的调试器窗口。
点击中间的帧率显示按钮,可以展开或收缩完整的调试器窗口。
完整的调试器窗口拥有以下几项:
1、Console [控制台日志]
这里可以查看所有的程序运行日志,包括使用Debug.Log系列打印的日志,或是其他的未捕获异常。
2、Memory [内存信息]
这里可以监控整个项目的内存使用信息,手动卸载资源,手动进行GC垃圾回收。
3、System [系统信息]
这里可以获取当前运行系统的信息,包括操作系统、处理器、显卡等硬件信息。
4、Screen [显示信息]
这里可以查看显示屏的相关信息,或者程序分辨率等,可以进行全屏和非全屏的切换。
5、Quality [图形质量]
这里可以查看或重新设置当前程序的图形显示质量。
6、Environment [环境信息]
这里可以查看游戏项目的基本信息。
因为最近在使用E神的GF框架,他自带的调试器感觉非常实用,但因为不能脱离框架单独使用,所以就参照着他的界面做了一个,功能几乎差不多,附上E神博客的链接:http://gameframework.cn/archives/279
Debugger源码:
using UnityEngine;using System.Collections.Generic;using System;using UnityEngine.Profiling;public class Debugger : MonoBehaviour { /// <summary> /// 是否允许调试 /// </summary> public bool AllowDebugging = true; private DebugType _debugType = DebugType.Console; private List<LogData> _logInformations = new List<LogData>(); private int _currentLogIndex = -1; private int _infoLogCount = 0; private int _warningLogCount = 0; private int _errorLogCount = 0; private int _fatalLogCount = 0; private bool _showInfoLog = true; private bool _showWarningLog = true; private bool _showErrorLog = true; private bool _showFatalLog = true; private Vector2 _scrollLogView = Vector2.zero; private Vector2 _scrollCurrentLogView = Vector2.zero; private Vector2 _scrollSystemView = Vector2.zero; private bool _expansion = false; private Rect _windowRect = new Rect(0, 0, 100, 60); private int _fps = 0; private Color _fpsColor = Color.white; private int _frameNumber = 0; private float _lastShowFPSTime = 0f; private void Start () { if (AllowDebugging) { Application.logMessageReceived += LogHandler; } } private void Update() { if (AllowDebugging) { _frameNumber += 1; float time = Time.realtimeSinceStartup - _lastShowFPSTime; if (time >= 1) { _fps = (int)(_frameNumber / time); _frameNumber = 0; _lastShowFPSTime = Time.realtimeSinceStartup; } } } private void OnDestory() { if (AllowDebugging) { Application.logMessageReceived -= LogHandler; } } private void LogHandler(string condition, string stackTrace, LogType type) { LogData log = new LogData(); log.time = DateTime.Now.ToString("HH:mm:ss"); log.message = condition; log.stackTrace = stackTrace; if (type == LogType.Assert) { log.type = "Fatal"; _fatalLogCount += 1; } else if (type == LogType.Exception || type == LogType.Error) { log.type = "Error"; _errorLogCount += 1; } else if (type == LogType.Warning) { log.type = "Warning"; _warningLogCount += 1; } else if (type == LogType.Log) { log.type = "Info"; _infoLogCount += 1; } _logInformations.Add(log); if (_warningLogCount > 0) { _fpsColor = Color.yellow; } if (_errorLogCount > 0) { _fpsColor = Color.red; } } private void OnGUI() { if (AllowDebugging) { if (_expansion) { _windowRect = GUI.Window(0, _windowRect, ExpansionGUIWindow, "DEBUGGER"); } else { _windowRect = GUI.Window(0, _windowRect, ShrinkGUIWindow, "DEBUGGER"); } } } private void ExpansionGUIWindow(int windowId) { GUI.DragWindow(new Rect(0, 0, 10000, 20)); #region title GUILayout.BeginHorizontal(); GUI.contentColor = _fpsColor; if (GUILayout.Button("FPS:" + _fps, GUILayout.Height(30))) { _expansion = false; _windowRect.width = 100; _windowRect.height = 60; } GUI.contentColor = (_debugType == DebugType.Console ? Color.white : Color.gray); if (GUILayout.Button("Console", GUILayout.Height(30))) { _debugType = DebugType.Console; } GUI.contentColor = (_debugType == DebugType.Memory ? Color.white : Color.gray); if (GUILayout.Button("Memory", GUILayout.Height(30))) { _debugType = DebugType.Memory; } GUI.contentColor = (_debugType == DebugType.System ? Color.white : Color.gray); if (GUILayout.Button("System", GUILayout.Height(30))) { _debugType = DebugType.System; } GUI.contentColor = (_debugType == DebugType.Screen ? Color.white : Color.gray); if (GUILayout.Button("Screen", GUILayout.Height(30))) { _debugType = DebugType.Screen; } GUI.contentColor = (_debugType == DebugType.Quality ? Color.white : Color.gray); if (GUILayout.Button("Quality", GUILayout.Height(30))) { _debugType = DebugType.Quality; } GUI.contentColor = (_debugType == DebugType.Environment ? Color.white : Color.gray); if (GUILayout.Button("Environment", GUILayout.Height(30))) { _debugType = DebugType.Environment; } GUI.contentColor = Color.white; GUILayout.EndHorizontal(); #endregion #region console if (_debugType == DebugType.Console) { GUILayout.BeginHorizontal(); if (GUILayout.Button("Clear")) { _logInformations.Clear(); _fatalLogCount = 0; _warningLogCount = 0; _errorLogCount = 0; _infoLogCount = 0; _currentLogIndex = -1; _fpsColor = Color.white; } GUI.contentColor = (_showInfoLog ? Color.white : Color.gray); _showInfoLog = GUILayout.Toggle(_showInfoLog, "Info [" + _infoLogCount + "]"); GUI.contentColor = (_showWarningLog ? Color.white : Color.gray); _showWarningLog = GUILayout.Toggle(_showWarningLog, "Warning [" + _warningLogCount + "]"); GUI.contentColor = (_showErrorLog ? Color.white : Color.gray); _showErrorLog = GUILayout.Toggle(_showErrorLog, "Error [" + _errorLogCount + "]"); GUI.contentColor = (_showFatalLog ? Color.white : Color.gray); _showFatalLog = GUILayout.Toggle(_showFatalLog, "Fatal [" + _fatalLogCount + "]"); GUI.contentColor = Color.white; GUILayout.EndHorizontal(); _scrollLogView = GUILayout.BeginScrollView(_scrollLogView, "Box", GUILayout.Height(165)); for (int i = 0; i < _logInformations.Count; i++) { bool show = false; Color color = Color.white; switch (_logInformations[i].type) { case "Fatal": show = _showFatalLog; color = Color.red; break; case "Error": show = _showErrorLog; color = Color.red; break; case "Info": show = _showInfoLog; color = Color.white; break; case "Warning": show = _showWarningLog; color = Color.yellow; break; default: break; } if (show) { GUILayout.BeginHorizontal(); if (GUILayout.Toggle(_currentLogIndex == i, "")) { _currentLogIndex = i; } GUI.contentColor = color; GUILayout.Label("[" + _logInformations[i].type + "] "); GUILayout.Label("[" + _logInformations[i].time + "] "); GUILayout.Label(_logInformations[i].message); GUILayout.FlexibleSpace(); GUI.contentColor = Color.white; GUILayout.EndHorizontal(); } } GUILayout.EndScrollView(); _scrollCurrentLogView = GUILayout.BeginScrollView(_scrollCurrentLogView, "Box", GUILayout.Height(100)); if (_currentLogIndex != -1) { GUILayout.Label(_logInformations[_currentLogIndex].message + "\r\n\r\n" + _logInformations[_currentLogIndex].stackTrace); } GUILayout.EndScrollView(); } #endregion #region memory else if (_debugType == DebugType.Memory) { GUILayout.BeginHorizontal(); GUILayout.Label("Memory Information"); GUILayout.EndHorizontal(); GUILayout.BeginVertical("Box");#if UNITY_5 GUILayout.Label("总内存:" + Profiler.GetTotalReservedMemory() / 1000000 + "MB"); GUILayout.Label("已占用内存:" + Profiler.GetTotalAllocatedMemory() / 1000000 + "MB"); GUILayout.Label("空闲中内存:" + Profiler.GetTotalUnusedReservedMemory() / 1000000 + "MB"); GUILayout.Label("总Mono堆内存:" + Profiler.GetMonoHeapSize() / 1000000 + "MB"); GUILayout.Label("已占用Mono堆内存:" + Profiler.GetMonoUsedSize() / 1000000 + "MB");#endif#if UNITY_7 GUILayout.Label("总内存:" + Profiler.GetTotalReservedMemoryLong() / 1000000 + "MB"); GUILayout.Label("已占用内存:" + Profiler.GetTotalAllocatedMemoryLong() / 1000000 + "MB"); GUILayout.Label("空闲中内存:" + Profiler.GetTotalUnusedReservedMemoryLong() / 1000000 + "MB"); GUILayout.Label("总Mono堆内存:" + Profiler.GetMonoHeapSizeLong() / 1000000 + "MB"); GUILayout.Label("已占用Mono堆内存:" + Profiler.GetMonoUsedSizeLong() / 1000000 + "MB");#endif GUILayout.EndVertical(); GUILayout.BeginHorizontal(); if (GUILayout.Button("卸载未使用的资源")) { Resources.UnloadUnusedAssets(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("使用GC垃圾回收")) { GC.Collect(); } GUILayout.EndHorizontal(); }#endregion #region system else if (_debugType == DebugType.System) { GUILayout.BeginHorizontal(); GUILayout.Label("System Information"); GUILayout.EndHorizontal(); _scrollSystemView = GUILayout.BeginScrollView(_scrollSystemView, "Box"); GUILayout.Label("操作系统:" + SystemInfo.operatingSystem); GUILayout.Label("系统内存:" + SystemInfo.systemMemorySize + "MB"); GUILayout.Label("处理器:" + SystemInfo.processorType); GUILayout.Label("处理器数量:" + SystemInfo.processorCount); GUILayout.Label("显卡:" + SystemInfo.graphicsDeviceName); GUILayout.Label("显卡类型:" + SystemInfo.graphicsDeviceType); GUILayout.Label("显存:" + SystemInfo.graphicsMemorySize + "MB"); GUILayout.Label("显卡标识:" + SystemInfo.graphicsDeviceID); GUILayout.Label("显卡供应商:" + SystemInfo.graphicsDeviceVendor); GUILayout.Label("显卡供应商标识码:" + SystemInfo.graphicsDeviceVendorID); GUILayout.Label("设备模式:" + SystemInfo.deviceModel); GUILayout.Label("设备名称:" + SystemInfo.deviceName); GUILayout.Label("设备类型:" + SystemInfo.deviceType); GUILayout.Label("设备标识:" + SystemInfo.deviceUniqueIdentifier); GUILayout.EndScrollView(); } #endregion #region screen else if (_debugType == DebugType.Screen) { GUILayout.BeginHorizontal(); GUILayout.Label("Screen Information"); GUILayout.EndHorizontal(); GUILayout.BeginVertical("Box"); GUILayout.Label("DPI:" + Screen.dpi); GUILayout.Label("分辨率:" + Screen.currentResolution.ToString()); GUILayout.EndVertical(); GUILayout.BeginHorizontal(); if (GUILayout.Button("全屏")) { Screen.SetResolution(Screen.currentResolution.width, Screen.currentResolution.height, !Screen.fullScreen); } GUILayout.EndHorizontal(); } #endregion #region Quality else if (_debugType == DebugType.Quality) { GUILayout.BeginHorizontal(); GUILayout.Label("Quality Information"); GUILayout.EndHorizontal(); GUILayout.BeginVertical("Box"); string value = ""; if (QualitySettings.GetQualityLevel() == 0) { value = " [最低]"; } else if (QualitySettings.GetQualityLevel() == QualitySettings.names.Length - 1) { value = " [最高]"; } GUILayout.Label("图形质量:" + QualitySettings.names[QualitySettings.GetQualityLevel()] + value); GUILayout.EndVertical(); GUILayout.BeginHorizontal(); if (GUILayout.Button("降低一级图形质量")) { QualitySettings.DecreaseLevel(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("提升一级图形质量")) { QualitySettings.IncreaseLevel(); } GUILayout.EndHorizontal(); } #endregion #region Environment else if (_debugType == DebugType.Environment) { GUILayout.BeginHorizontal(); GUILayout.Label("Environment Information"); GUILayout.EndHorizontal(); GUILayout.BeginVertical("Box"); GUILayout.Label("项目名称:" + Application.productName);#if UNITY_5 GUILayout.Label("项目ID:" + Application.bundleIdentifier);#endif#if UNITY_7 GUILayout.Label("项目ID:" + Application.identifier);#endif GUILayout.Label("项目版本:" + Application.version); GUILayout.Label("Unity版本:" + Application.unityVersion); GUILayout.Label("公司名称:" + Application.companyName); GUILayout.EndVertical(); GUILayout.BeginHorizontal(); if (GUILayout.Button("退出程序")) { Application.Quit(); } GUILayout.EndHorizontal(); }#endregion } private void ShrinkGUIWindow(int windowId) { GUI.DragWindow(new Rect(0, 0, 10000, 20)); GUI.contentColor = _fpsColor; if (GUILayout.Button("FPS:" + _fps, GUILayout.Width(80), GUILayout.Height(30))) { _expansion = true; _windowRect.width = 600; _windowRect.height = 360; } GUI.contentColor = Color.white; }}public struct LogData{ public string time; public string type; public string message; public string stackTrace;}public enum DebugType{ Console, Memory, System, Screen, Quality, Environment}
阅读全文
0 0
- Unity 微型调试器 Debugger
- 微型调试器
- Python 调试器debugger
- debugger调试
- Windows基础调试器(BASIC DEBUGGER)
- Python学习笔记--调试器debugger
- vs2010调试 visualizer debugger
- JS 调试 debugger
- rails中debugger调试
- Java debugger模式调试
- 前端debugger调试
- javaScript调试(debugger;)
- Debugger调试器无法启动 the debugger is not properly installed
- Windows用户级调试器(debugger)编写框架
- Flash实时调试器分享下载 — AGE Live Debugger
- 利用Win32 Debug API打造自己的调试器Debugger
- GDK - General Kernel Debugger 通用内核调试器图标
- 网络通讯调试器(Network communication Debugger)开源了
- [bzoj2435][树链剖分]道路修建
- BZOJ1787: [Ahoi2008]Meet 紧急集合
- Android设置系统状态栏颜色
- linux主机使用vnc服务访问服务器图形化桌面
- 从细节到宏观的seo方案制定
- Unity 微型调试器 Debugger
- UI设计相关网址
- 大数据学习笔记(八)-Hive(基础)
- Letasoft Sound Booster 放大音量
- Architecture Components之LiveData的扩展
- Thinking in Java:第一章-对象导论(目前没得对象啊)
- 线程池的参数讲解
- 时间复杂度和空间复杂度的计算
- Bootstrap fileinput 不显示中文解决办法