136 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
	
	
| 
 | |
| using System;
 | |
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| using MotionFramework.Reference;
 | |
| 
 | |
| namespace MotionFramework.Console
 | |
| {
 | |
| 	[ConsoleAttribute("游戏日志", 101)]
 | |
| 	internal class GameLogWindow : IConsoleWindow
 | |
| 	{
 | |
| 		private class LogWrapper : IReference
 | |
| 		{
 | |
| 			public LogType Type;
 | |
| 			public string Log;
 | |
| 			public void OnRelease()
 | |
| 			{
 | |
| 				Log = string.Empty;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// 日志最大显示数量
 | |
| 		/// </summary>
 | |
| 		private const int LOG_MAX_COUNT = 2000;
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// 日志集合
 | |
| 		/// </summary>
 | |
| 		private List<LogWrapper> _logs = new List<LogWrapper>();
 | |
| 
 | |
| 		private int _totalCount = 0;
 | |
| 		private int _logCount = 0;
 | |
| 		private int _warningCount = 0;
 | |
| 		private int _errorCount = 0;
 | |
| 
 | |
| 		// GUI相关
 | |
| 		private bool _showLog = true;
 | |
| 		private bool _showWarning = true;
 | |
| 		private bool _showError = true;
 | |
| 		private Vector2 _scrollPos = Vector2.zero;
 | |
| 
 | |
| 		// 过滤的关键字
 | |
| 		private string _filterKey = string.Empty;
 | |
| 
 | |
| 
 | |
| 		public GameLogWindow()
 | |
| 		{
 | |
| 			// 注册UnityEngine日志系统
 | |
| 			Application.logMessageReceived += HandleUnityEngineLog;
 | |
| 		}
 | |
| 		void IConsoleWindow.OnGUI()
 | |
| 		{
 | |
| 			GUILayout.BeginHorizontal();
 | |
| 			if (GUILayout.Button("Clear", ConsoleGUI.ButtonStyle, GUILayout.Width(100)))
 | |
| 			{
 | |
| 				_totalCount = 0;
 | |
| 				_logCount = 0;
 | |
| 				_warningCount = 0;
 | |
| 				_errorCount = 0;
 | |
| 				_logs.Clear();
 | |
| 			}
 | |
| 			_showLog = ConsoleGUI.Toggle($"Log ({_logCount})", _showLog);
 | |
| 			_showWarning = ConsoleGUI.Toggle($"Warning ({_warningCount})", _showWarning);
 | |
| 			_showError = ConsoleGUI.Toggle($"Error ({_errorCount})", _showError);
 | |
| 			GUILayout.EndHorizontal();
 | |
| 
 | |
| 			GUILayout.BeginHorizontal();
 | |
| 			{
 | |
| 				GUILayout.Label("搜索关键字 : ", ConsoleGUI.LableStyle, GUILayout.Width(200));
 | |
| 				_filterKey = GUILayout.TextField(_filterKey, ConsoleGUI.TextFieldStyle, GUILayout.Width(500));
 | |
| 			}
 | |
| 			GUILayout.EndHorizontal();
 | |
| 
 | |
| 			float offset = ConsoleGUI.ToolbarStyle.fixedHeight * 3;
 | |
| 			_scrollPos = ConsoleGUI.BeginScrollView(_scrollPos, offset);
 | |
| 			for (int i = 0; i < _logs.Count; i++)
 | |
| 			{
 | |
| 				LogWrapper wrapper = _logs[i];
 | |
| 
 | |
| 				// 只搜索关键字
 | |
| 				if (string.IsNullOrEmpty(_filterKey) == false)
 | |
| 				{
 | |
| 					if (wrapper.Log.Contains(_filterKey) == false)
 | |
| 						continue;
 | |
| 				}
 | |
| 
 | |
| 				if (wrapper.Type == LogType.Log)
 | |
| 				{
 | |
| 					if (_showLog)
 | |
| 						ConsoleGUI.Lable(wrapper.Log);
 | |
| 				}
 | |
| 				else if (wrapper.Type == LogType.Warning)
 | |
| 				{
 | |
| 					if (_showWarning)
 | |
| 						ConsoleGUI.YellowLable(wrapper.Log);
 | |
| 				}
 | |
| 				else if (wrapper.Type == LogType.Assert || wrapper.Type == LogType.Error || wrapper.Type == LogType.Exception)
 | |
| 				{
 | |
| 					if (_showError)
 | |
| 						ConsoleGUI.RedLable(wrapper.Log);
 | |
| 				}
 | |
| 			}
 | |
| 			ConsoleGUI.EndScrollView();
 | |
| 		}
 | |
| 
 | |
| 		private void HandleUnityEngineLog(string logString, string stackTrace, LogType type)
 | |
| 		{
 | |
| 			LogWrapper wrapper = ReferencePool.Spawn<LogWrapper>();
 | |
| 			wrapper.Type = type;
 | |
| 
 | |
| 			_totalCount++;
 | |
| 			if (type == LogType.Assert || type == LogType.Error || type == LogType.Exception)
 | |
| 				wrapper.Log = $"[{_totalCount}] " + logString + "\n" + stackTrace;
 | |
| 			else
 | |
| 				wrapper.Log = $"[{_totalCount}] " + logString;
 | |
| 
 | |
| 			if (type == LogType.Log)
 | |
| 				_logCount++;
 | |
| 			else if (type == LogType.Warning)
 | |
| 				_warningCount++;
 | |
| 			else if (type == LogType.Assert || type == LogType.Error || type == LogType.Exception)
 | |
| 				_errorCount++;
 | |
| 			else
 | |
| 				throw new NotImplementedException(type.ToString());
 | |
| 
 | |
| 			_logs.Add(wrapper);
 | |
| 			if (_logs.Count > LOG_MAX_COUNT)
 | |
| 			{
 | |
| 				ReferencePool.Release(_logs[0]);
 | |
| 				_logs.RemoveAt(0);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| } |