服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - 详解Unity日志打印工具功能

详解Unity日志打印工具功能

2022-12-24 14:38小紫苏 C#

Unity是一个非常火的游戏引擎,我们再开发的时候有的时候要进行程序的调试,下面给大家介绍下Unity日志打印工具功能,感兴趣的朋友一起看看吧

一、日志工具功能

封装Debug类,需要实现功能:

1.控制所有日志是否打印;

2.除了Log,Warning,Error外,给更多日志种类(不同颜色);

3.格式化打印日志;

4.不定参数,自动拼接成字符串;

5.上传日志到服务器;

 

二、Logger类

1.控制日志打印

封装Debug中关于Log的方法;

使用静态方法,声明静态字段,控制log,warning,error是否打印;

详解Unity日志打印工具功能

Debug源码中Log方法有两个重载;

详解Unity日志打印工具功能

第二个参数context可以传参GameObject,Hierarchy或者Project窗口中的预制体,双击Console日志会直接跳转选中传入的游戏物体;

我们可以将这个方法合并,第二个参数默认空;

详解Unity日志打印工具功能

2.色彩打印

打印不同颜色使用富文本;

string.Format("<color={0}>{1}</color>",color,obj);

3.多参数拼接

之前使用Go语言的fmt.Println有个功能很好用,连续传多个参数自动拼接;

public static void Log(params object[] messags)
{
  if (!s_debugLogEnable) return;

  string message = string.Empty;
  foreach (var it in messags)
  {
      message += it.ToString();
  }

  Debug.Log(message, null);
}

//调用
Logger.Log("Net error:",error,"msgId:",msgId);

4.格式化打印

格式化打印封装原本Debug.LogFormat方法;

public static void LogFormat(string format, params object[] args)
{
  if (!s_debugLogEnable) return;
  Debug.LogFormat(format, args);
}

 

三、LoggerMgr类

继承MonoBehavior的单例;

初始化Logger中的三个控制打印的字段;

Application类中有收到日志消息触发的事件LogMessageReceived;

监听这个事件;如果日志开关为关闭状态return;

if (isOpenLog)
{
  Logger.s_debugLogEnable = true;
  Logger.s_warningLogEnable = true;
  Logger.s_errorLogEnable = true;          
}

Application.logMessageReceived += (string condition, string stackTrace, LogType type) =>
{
  switch (type)
  {
      case LogType.Log:
          {
              if (!Logger.s_debugLogEnable) return;
          }
          break;
      case LogType.Warning:
          {
              if (!Logger.s_warningLogEnable) return;
          }
          break;
      case LogType.Error:
          {
              if (!Logger.s_errorLogEnable) return;
          }
          break;
  }
};

 

四、上传日志

LoggerMgr中初始化上传日志信息;

方法写在logger中,在LoggerMgr开始调用;

public static void Init(string url)
{
  LogUploader.SetUploadUrl(url);
  // 日期
  var t = System.DateTime.Now.ToString("yyyyMMddhhmmss");
  s_logFileSavePath = string.Format("{0}/output_{1}.log", Application.persistentDataPath, t);
  Application.logMessageReceived += OnLogCallBack;
}

OnLogCallBack方法中将日志和栈信息存储成文件,等待上传;

private static void OnLogCallBack(string condition, string stackTrace, LogType type)
{
  s_logStr.Append(condition);
  s_logStr.Append("\n");
  s_logStr.Append(stackTrace);
  s_logStr.Append("\n");

  if (s_logStr.Length <= 0) return;
  if (!File.Exists(s_logFileSavePath))
  {
      var fs = File.Create(s_logFileSavePath);
      fs.Close();
  }
  using (var sw = File.AppendText(s_logFileSavePath))
  {
      sw.WriteLine(s_logStr.ToString());
  }
  s_logStr.Remove(0, s_logStr.Length);
}

LogUploader类

开启协程上传日志文件;

public static void StartUploadLog(string logFilePath, string desc)
{
  if (LOG_UPLOAD_URL == string.Empty)
      return;

  var go = new GameObject("LogUploader");
  var bhv = go.AddComponent<LogUploader>();
  bhv.StartCoroutine(bhv.UploadLog(logFilePath, LOG_UPLOAD_URL, desc));
}

在Logger类中同样封装上面的方法,所有的日志都通过Logger打印;

public static void UploadLog(string desc)
{
  LogUploader.StartUploadLog(s_logFileSavePath, desc);
}

 

五、日志双击溯源问题

以上的代码有个很大的问题,现在我们双击不会回到调用Logger的地方,只会跳转到Logger类中调用Debug.Log的地方;

有个很简单的办法解决,将上面代码编译成dll;

另外查找源码也可以自己决定掉转位置;

具体方法,通过反射获日志取栈信息,根据Logger类返回的栈信息路径,筛选出要跳转的位置;

通过官方提供的方法跳转到相应位置;

UnityEditorInternal.InternalEditorUtility.OpenFileAtLineExternal(string filename, int line);

六、调用

void Start()
{
  Logger.Log("aaaa");
  Logger.LogFormat("{0}===={1}",111,0.232);
  Logger.LogGreen("bbbb");
  Logger.LogError("log error");
  Logger.Log("aa", 13, "fff",16,"sfddf",64654);
  Logger.UploadLog("NetWork LogTest");
}

详解Unity日志打印工具功能

工具类下载

到此这篇关于Unity日志打印工具的文章就介绍到这了,更多相关Unity日志打印内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/littleperilla/p/15854027.html

延伸 · 阅读

精彩推荐
  • C#unity实现弧形移动 可角度自定

    unity实现弧形移动 可角度自定

    这篇文章主要为大家详细介绍了unity实现弧形移动,可角度自定,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    于子潇9622022-09-16
  • C#C# TreeNode案例详解

    C# TreeNode案例详解

    这篇文章主要介绍了C# TreeNode案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    luckyone90612312021-11-24
  • C#C#实现推送钉钉消息的方法示例

    C#实现推送钉钉消息的方法示例

    这篇文章主要介绍了C#实现推送钉钉消息的方法,结合实例形式分析了C#使用钉钉API实现消息推送的相关操作技巧与注意事项,需要的朋友可以参考下...

    啊ten9182022-03-09
  • C#C#编写ActiveX网页截图控件

    C#编写ActiveX网页截图控件

    这篇文章主要介绍了C#编写ActiveX网页截图控件,作为学习C#编写ActiveX的一个简单入门教程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小...

    大萝卜控8012021-11-25
  • C#C#程序(含多个Dll)合并成一个Exe的简单方法

    C#程序(含多个Dll)合并成一个Exe的简单方法

    这篇文章主要为大家详细介绍了C#程序(含多个Dll)合并成一个Exe的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    飘渺公子6422021-12-13
  • C#C#调用dos窗口获取相关信息的方法

    C#调用dos窗口获取相关信息的方法

    这篇文章主要介绍了C#调用dos窗口获取相关信息的方法,涉及C#调用dos窗口及进程操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    我心依旧10612021-10-22
  • C#简单掌握Windows中C#启动外部程序进程的方法

    简单掌握Windows中C#启动外部程序进程的方法

    这篇文章主要介绍了Windows中C#启动外部程序进程的方法,例子中同时包括了进程关闭的方法,需要的朋友可以参考下...

    C#教程网6522021-11-16
  • C#C#数据类型转换(显式转型、隐式转型、强制转型)

    C#数据类型转换(显式转型、隐式转型、强制转型)

    本文详细讲解了C#数据类型转换(显式转型、隐式转型、强制转型),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要...

    痴者工良3902022-12-20