当前位置: 首页 > news >正文

【GameFramework框架内置模块】4、内置模块之调试器(Debugger)

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • 简书地址
  • QQ群:398291828

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

【GameFramework框架】系列教程目录:
https://blog.csdn.net/q764424567/article/details/135831551

二、正文

2-1、介绍

日志模块,大家都很熟悉了,为啥GameFramework框架又做了这么一个模块呢。

大家在使用Debug.Log打印日志的时候,相比大家也能发现一些问题,比如说:

  • 在开发环境需要打印日志,在正式环境需要关闭日志,Unity没有全局开关日志的方法
  • 没有日志文件保存到指定路径的功能

而GameFramework框架的调试器Debugger模块主要就是实现这两个功能:

  • 发布产品,关闭所有日志或者仅开启错误及以上级别日志,开发调试的时候自定义开启日志级别。
  • 将日志保存到文件的功能

下面就来看一下如何使用。

2-2、使用说明

示例参考代码:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Test05 : MonoBehaviour
{void Start(){UnityEngine.Debug.Log("Unity普通日志");UnityEngine.Debug.LogWarning("Unity警告日志");UnityEngine.Debug.LogError("Unity错误日志");UnityGameFramework.Runtime.Log.Debug("框架打印调试级别日志");UnityGameFramework.Runtime.Log.Info("框架打印信息级别日志");UnityGameFramework.Runtime.Log.Warning("框架打印警告级别日志");UnityGameFramework.Runtime.Log.Error("框架打印错误级别日志");// 演示打印日志参数string name = "张三";string city = "深圳";int age = 18;string sex = "男";UnityGameFramework.Runtime.Log.Debug("{0}用户来自{1},年龄 {2},性别 {3}.....", name, city, age, sex);}
}

运行结果:
在这里插入图片描述
设置关闭所有日志或者或者仅开启错误及以上级别日志:
在这里插入图片描述
日志保存文件这个功能框架接口写好了,我们只需要调用即可。

我们新建一个脚本FileLogHelper继承于DefaultLogHelper

using GameFramework;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
using UnityGameFramework.Runtime;internal class FileLogHelper : DefaultLogHelper
{//设置日志文件保存路径-你可以自定义,也可以使用系统的private readonly string CurrentLogPath = Utility.Path.GetRegularPath(Path.Combine(Application.persistentDataPath, "current.log"));private readonly string PreviousLogPath = Utility.Path.GetRegularPath(Path.Combine(Application.persistentDataPath, "previous.log"));public FileLogHelper(){Application.logMessageReceived += OnLogMessageReceived;try{//每次运行的时候将日志替换,就像队列一样if (File.Exists(PreviousLogPath)){File.Delete(PreviousLogPath);}if (File.Exists(CurrentLogPath)){File.Move(CurrentLogPath, PreviousLogPath);}}catch{}}private void OnLogMessageReceived(string logMessage, string stackTrace, LogType logType){string log = Utility.Text.Format("[{0}][{1}] {2}{4}{3}{4}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), logType.ToString(), logMessage ?? "<Empty Message>", stackTrace ?? "<Empty StackTrace>", Environment.NewLine);try{File.AppendAllText(CurrentLogPath, log, Encoding.UTF8);}catch{}}
}

在Base脚本选择使用:
在这里插入图片描述

2-3、实现及代码分析

OK,接下来,我们就来分析一下,如何禁用日志打印及日志文件保存的。

        /// <summary>/// 打印调试级别日志,用于记录调试类日志信息。/// </summary>/// <param name="message">日志内容。</param>/// <remarks>仅在带有 ENABLE_LOG、ENABLE_DEBUG_LOG 或 ENABLE_DEBUG_AND_ABOVE_LOG 预编译选项时生效。</remarks>[Conditional("ENABLE_LOG")][Conditional("ENABLE_DEBUG_LOG")][Conditional("ENABLE_DEBUG_AND_ABOVE_LOG")]public static void Debug(object message){GameFrameworkLog.Debug(message);}
  • 使用 预处理指令(宏) 与 Conditional特性 设置是否忽略方法调用
  • 预处理指令使用 LogScriptingDefineSymbols类 ScriptingDefineSymbols类 进行设置

LogScriptingDefineSymbols.cs
在这里插入图片描述
ScriptingDefineSymbols.cs
几层调用之后,可以看到 ScriptingDefineSymbols 类:
在这里插入图片描述

  • 使用 Unity的PlayerSettings类 设置 预处理指令

Player Settings 是您为即将在 Unity 中构建的最终游戏定义各种参数的地方。
其中一些值将用于您打开独立平台游戏时所启动的分辨率对话框。

Unity中的预处理指令设置:
在这里插入图片描述

三、后记

如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。


你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏方向简介
Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。

相关文章:

  • https://htmlunit.sourceforge.io/
  • SpringBoot快速入门(黑马学习笔记)
  • Vue.js+SpringBoot开发超市商品管理系统
  • 基于Springboot + Vue 母婴商城系统
  • SQL库操作
  • Mac使用K6工具压测WebSocket
  • uniapp中在app中清除缓存功能
  • 分布式任务调度的几种实现(Redis实现分布式锁 MySQL实现任务调度 负载均衡)
  • 大语言模型的开山之作—探秘GPT系列:GPT-1-GPT2-GPT-3的进化之路
  • MATLAB环境下一种改进的瞬时频率(IF)估计方法
  • YOLO算法改进Backbone系列之:EfficientViT
  • PYTHON-使用正则表达式进行模式匹配
  • go-zero微服务入门教程
  • LangChain支持哔哩哔哩视频总结
  • 深度学习系列59:文字识别
  • Asm.js的简单介绍
  • FastReport在线报表设计器工作原理
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • input的行数自动增减
  • laravel5.5 视图共享数据
  • Python3爬取英雄联盟英雄皮肤大图
  • Vue 动态创建 component
  • 第2章 网络文档
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 技术:超级实用的电脑小技巧
  • 蓝海存储开关机注意事项总结
  • 区块链技术特点之去中心化特性
  • 限制Java线程池运行线程以及等待线程数量的策略
  • zabbix3.2监控linux磁盘IO
  • 移动端高清、多屏适配方案
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #mysql 8.0 踩坑日记
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $.ajax()方法详解
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (一)Dubbo快速入门、介绍、使用
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)程序员技术练级攻略
  • (状压dp)uva 10817 Headmaster's Headache
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .net 反编译_.net反编译的相关问题
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .Net各种迷惑命名解释
  • .NET构架之我见
  • @Autowired标签与 @Resource标签 的区别
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [1] 平面(Plane)图形的生成算法