本文的主要目的是在将Unity项目发布成APK后,在APK的操作界面方便查看应用中的LOG信息,以方便调试
实现的方式主要是利用Unity自带的Debug.Log()方法再次封装,使用GUI的API将自己的LOG信息显示在上层界面
闲话不多说,直接上代码:
这个脚本主要是用来接收项目中打印的LOG信息
using UnityEngine; using System.Collections; using System.Collections.Generic; using System.Text; public class GameDebugLog : System.Object {
/// <summary> /// Log level .定义LOG的类型:正常、警告、错误、异常 /// </summary> public enum LogLevel : byte { /// <summary> /// The normal. /// </summary> Normal = 0, /// <summary> /// The warning. /// </summary> Warning, /// <summary> /// The error. /// </summary> Error, /// <summary> /// The exception. /// </summary> Exception, } /// <summary> /// Log the specified msg and objs. /// </summary> /// <param name="msg">Message.</param> /// <param name="objs">Objects.</param> public static void Log(string msg, params object[] objs) { OutputLog(LogLevel.Normal, msg, objs); } /// <summary> /// Logs the warning. /// </summary> /// <param name="msg">Message.</param> /// <param name="objs">Objects.</param> public static void LogWarning(string msg, params object[] objs) { OutputLog(LogLevel.Warning, msg, objs); } /// <summary> /// Logs the error. /// </summary> /// <param name="msg">Message.</param> /// <param name="objs">Objects.</param> public static void LogError(string msg, params object[] objs) { OutputLog(LogLevel.Error, msg, objs); } /// <summary> /// Logs the exception. /// </summary> /// <param name="msg">Message.</param> /// <param name="objs">Objects.</param> public static void LogException(System.Exception e) { OutputExceptionLog(e); } /// <summary> /// Log content. /// </summary> public class LogContent { public string Msg { get; set; } public LogLevel Level { get; set; } } /// <summary> /// The logs. /// </summary> public static List<LogContent> logs; /// <summary> /// Adds the log centent. /// </summary> /// <param name="level">Level.</param> /// <param name="msg">Message.</param> public static void AddLogCentent(LogLevel level, string msg) { if (logs == null) logs = new List<LogContent>(); if (logs != null) { if (logs.Count > 20) logs.RemoveAt(0); LogContent log = new LogContent(); log.Msg = msg; log.Level = level; logs.Add(log); } } public static bool isEditor = Application.isEditor; /// <summary> /// Outputs the log. /// </summary> /// <param name="level">Level.</param> /// <param name="msg">Message.</param> /// <param name="objs">Objects.</param> public static void OutputLog(LogLevel level, string msg, params object[] objs) { StringBuilder sb = new StringBuilder(); sb.AppendFormat(msg, objs); #if DEBUG_LOG_EDITOR if (Application.isPlaying && !isEditor) #else if (Application.isPlaying) #endif { AddLogCentent(level, sb.ToString()); } else { if (level == LogLevel.Normal) Debug.Log(sb.ToString()); else if (level == LogLevel.Warning) Debug.LogWarning(sb.ToString()); else if (level == LogLevel.Error) Debug.LogError(sb.ToString()); } } /// <summary> /// Outputs the exception log. /// </summary> /// <param name="e">E.</param> public static void OutputExceptionLog(System.Exception e) { #if DEBUG_LOG_EDITOR if (Application.isPlaying && !isEditor) #else if (Application.isPlaying) #endif { StringBuilder sb = new StringBuilder(); sb.AppendFormat("{0} \n{1}", e.Message, e.StackTrace); AddLogCentent(LogLevel.Exception, sb.ToString()); } else { Debug.LogError(e); } Debug.LogError(e); } /// <summary> /// The log position. /// </summary> public static Vector2 logPos; /// <summary> /// The log rect. /// </summary> public static Rect logRect; /// <summary> /// The level setting. /// </summary> public class LevelSetting { /// <summary> /// Gets or sets the title. /// </summary> /// <value>The title.</value> public string Title { get; set; } /// <summary> /// Gets or sets the color of the title. /// </summary> /// <value>The color of the title.</value> public Color TitleColor { get; set; } } /// <summary> /// Level settings. /// </summary> }
这个方法主要是在你的主类中进行调用,使用的是Unity的生命周期方法
public void OnGUI() { if (!Application.isPlaying) return; if (levelSettings == null) { levelSettings = new Dictionary<GameDebugLog.LogLevel, GameDebugLog.LevelSetting>(); levelSettings[GameDebugLog.LogLevel.Normal] = new GameDebugLog.LevelSetting(); levelSettings[GameDebugLog.LogLevel.Normal].Title = "Normal: "; levelSettings[GameDebugLog.LogLevel.Normal].TitleColor = Color.blue; levelSettings[GameDebugLog.LogLevel.Warning] = new GameDebugLog.LevelSetting(); levelSettings[GameDebugLog.LogLevel.Warning].Title = "Warning: "; levelSettings[GameDebugLog.LogLevel.Warning].TitleColor = new Color(1f, 0.5f, 0f, 1f); levelSettings[GameDebugLog.LogLevel.Error] = new GameDebugLog.LevelSetting(); levelSettings[GameDebugLog.LogLevel.Error].Title = "Error: "; levelSettings[GameDebugLog.LogLevel.Error].TitleColor = new Color(1f, 0f, 0f, 1f); levelSettings[GameDebugLog.LogLevel.Exception] = new GameDebugLog.LevelSetting(); levelSettings[GameDebugLog.LogLevel.Exception].Title = "Exception: "; levelSettings[GameDebugLog.LogLevel.Exception].TitleColor = new Color(1f, 0f, 0.5f, 1f); GameDebugLog.logPos = Vector2.zero; GameDebugLog.logRect = new Rect(Screen.width - 402, Screen.height - 268, 400, 266); } Color backgroundColor = GUI.backgroundColor; Color oldContentColor = GUI.contentColor; GUI.backgroundColor = new Color(0.5f, 0.0f, 0.0f, 0.5f); GUI.Box(GameDebugLog.logRect, ""); GUILayout.BeginArea(GameDebugLog.logRect); GameDebugLog.logPos = GUILayout.BeginScrollView(GameDebugLog.logPos, GUILayout.Width(400), GUILayout.Height(266)); if (GameDebugLog.logs != null) { for (int i = 0, imax = GameDebugLog.logs.Count; i < imax; ++i) { GUI.contentColor = levelSettings[GameDebugLog.logs[i].Level].TitleColor; //GUILayout.BeginHorizontal(); GUILayout.Label(levelSettings[GameDebugLog.logs[i].Level].Title, GUILayout.Width(80)); GUI.contentColor = Color.green; GUILayout.Label(GameDebugLog.logs[i].Msg); //GUILayout.EndHorizontal(); } } GUILayout.EndScrollView(); GUILayout.EndArea(); GUI.contentColor = oldContentColor; GUI.backgroundColor = backgroundColor; }
显示效果如下图:
在项目中可以通过这样的方式方便定位问题所在,希望也能方便各位开发大大哦!