【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和坑,让后来人可以有些参考。
相关推荐
七夜zippoe20 小时前
OpenClaw 内置工具详解
unity·ai·游戏引擎·openclaw·内置工具
时光之源1 天前
使用ssh用Cursor/TRAE/VSCode链接远程服务器并运行可视化程序,显示在本地机器上,全流程教学!
ide·vscode·编辑器
神の愛1 天前
VSCode报错了??
ide·vscode·编辑器
mxwin1 天前
Unity Shader 细节贴图技术在不增加显存开销的前提下,有效提升近距离纹理细节的渲染质量
unity·游戏引擎·贴图
KvPiter1 天前
AI辅助开发行业动态(202603)
人工智能·编辑器
魔士于安1 天前
unity 低多边形 动物 带场景 有氛围感
游戏·unity·游戏引擎·贴图
小贺儿开发1 天前
Unity3D 摩斯与中文电码转换工具
科技·unity·人机交互·工具·实践·实用·科普应用
魔士于安1 天前
unity 动物包 大象 鹿 狐狸
游戏·unity·游戏引擎·贴图·模型
无巧不成书02181 天前
编辑器、编译器与解释器全解析
编辑器·编译原理·编译器·编程入门·解释器·开发工具链
Irene19911 天前
Cursor 访问在 WSL 中的项目:使用不同的编辑器修改WSL中的同一个项目,会自动同步
编辑器