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

推荐阅读

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

一、前言

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

二、正文

2-1、介绍

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

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

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

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

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

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

2-2、使用说明

示例参考代码:

csharp 复制代码
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

csharp 复制代码
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,接下来,我们就来分析一下,如何禁用日志打印及日志文件保存的。

csharp 复制代码
        /// <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之UGUI UGUI Unity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据 文件读取 使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合 数据集合 数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发 虚拟仿真 总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件 插件 主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发 日常记录 主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG 日常记录 记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。
相关推荐
ellis19708 小时前
Unity插件SafeArea Helper适配异形屏详解
unity
nnsix9 小时前
Unity Physics.Raycast的 QueryTriggerInteraction枚举作用
unity·游戏引擎
地狱为王9 小时前
Cesium for Unity叠加行政区划线
unity·gis·cesium
esmap16 小时前
技术深度解析:ESMap引擎VS主流数字孪生竞品
人工智能·物联网·3d·编辑器·智慧城市·webgl
claider18 小时前
Vim User Manual 阅读笔记 usr_22.txt Finding the file to edit 多文件编辑浏览
笔记·编辑器·vim
小贺儿开发18 小时前
Unity3D 八大菜系连连看
游戏·unity·互动·传统文化
在路上看风景18 小时前
25. 屏幕像素和纹理像素不匹配
unity
ۓ明哲ڪ20 小时前
Unity功能——创建新脚本时自动添加自定义头注释
unity·游戏引擎
熬夜敲代码的小N20 小时前
Unity大场景卡顿“急救包”:从诊断到落地的全栈优化方案
java·unity·游戏引擎
qq_3975623120 小时前
使用vscode , 开发keil单片机工程 . (为了使用ai助手)
ide·vscode·编辑器