Unity输出带点击跳转功能的Log实现技巧详解

Unity输出带点击跳转功能的Log实现技巧详解

在Unity开发中,我们经常需要输出Log信息来检查程序运行的过程,但是在大项目中,很难快速定位到特定的代码行,于是带有点击跳转功能的Log输出就显得尤为重要。本文将详细介绍如何实现带有点击跳转功能的Log输出。

1. 前提条件

在实现具有点击跳转功能的Log输出之前,我们需要确保我们已经掌握了以下基础知识:

  • C#语言基础
  • Unity引擎基础

2. 实现步骤

2.1 封装Log输出函数

首先,我们需要封装一个具有点击跳转功能的Log输出函数,在输出Log信息的同时,我们需要将当前代码的调用栈信息记录下来,以便在点击Log信息时能够跳转到对应的代码行。

public static class DebugUtils
{
    public static void Log(string msg, [CallerFilePath] string path = "", [CallerLineNumber] int line = 0)
    {
        string logInfo = $"{Path.GetFileName(path)}:{line} {msg}";
        Debug.Log(logInfo);
    }
}

这里通过使用[CallerFilePath][CallerLineNumber]属性,获取当前代码的文件路径和行号信息,并使用$占位符字符串拼接方式,将消息内容和当前代码的调用栈信息合并成了一条Log信息。

2.2 为Log信息添加跳转功能

接下来,我们需要为输出的Log信息添加点击跳转功能。通常情况下,我们点击Log信息只能跳转到当前Log信息输出的位置,而无法跳转到真正的错误发生位置。因此,在Log信息的每个调用栈信息中都需要包含文件名、行号和方法名等信息,以便在点击时精确定位到错误发生的位置。

Unity提供了一个APIUnityEditorInternal.InternalEditorUtility.OpenFileAtLineExternal(string fileName, int line),可以在外部编辑器中打开指定文件并跳转到指定行号的位置。我们可以在点击Log信息时,根据Log信息中记录的文件名和行号信息,调用该API打开代码文件并跳转到指定的行号。

using UnityEditorInternal;
using System.Diagnostics;

public static void Log(string msg, [CallerFilePath] string path = "", [CallerLineNumber] int line = 0, [CallerMemberName] string member = "")
{
    string fileName = Path.GetFileName(path);
    string logInfo = $"{fileName}:{line} {msg}";
    Debug.Log(logInfo);

    StackTrace stackTrace = new StackTrace(true);
    for (int i = 0; i < stackTrace.FrameCount; i++)
    {
        StackFrame stackFrame = stackTrace.GetFrame(i);

        string stackFileName = stackFrame.GetFileName();
        if (stackFileName != null && stackFileName.EndsWith(fileName))
        {
            int stackLine = stackFrame.GetFileLineNumber();

            string method = stackFrame.GetMethod().Name;
            string stackInfo = $"{stackFileName}:{stackLine} {method}";

            logInfo += $"\n\tat {stackInfo}";
            logInfo += (stackLine == line && member == method) ? " <- THIS" : "";
        }
    }

    Debug.Log(logInfo);

    EditorGUIUtility.AddCursorRect(
        GUILayoutUtility.GetLastRect(),
        MouseCursor.Link
    );

    if (Event.current.type == EventType.MouseDown && Event.current.button == 0)
    {
        for (int i = 0; i < stackTrace.FrameCount; i++)
        {
            StackFrame stackFrame = stackTrace.GetFrame(i);
            string stackFileName = stackFrame.GetFileName();
            if (stackFileName != null && stackFileName.EndsWith(fileName))
            {
                int stackLine = stackFrame.GetFileLineNumber();
                string method = stackFrame.GetMethod().Name;

                if (stackLine == line && member == method)
                {
                    string fullPath = Path.GetFullPath(stackFileName);
                    InternalEditorUtility.OpenFileAtLineExternal(fullPath, stackLine);
                }
            }
        }
    }
}

在上面的代码中,我们使用了System.Diagnostics.StackTrace类获取了完整的调用栈信息,然后遍历每个调用栈信息,将每个调用栈信息都添加在Log信息中,并在当前的调用栈信息中添加一个“<- THIS”的标记。在输出Log信息时,我们使用GUILayoutUtility.GetLastRect()方法获取最后一次通过GUILayout函数创建的GUI矩形区域,然后使用EditorGUIUtility.AddCursorRect()方法为该区域添加鼠标光标标志,以表明该区域支持鼠标点击事件。如果检测到鼠标左键按下事件,就遍历调用栈信息,找到对应的代码文件名和行号信息,并使用InternalEditorUtility.OpenFileAtLineExternal()方法打开对应的编辑器并跳转到指定的行号。

2.3 示例

下面是一个简单的示例,我们可以在一个按钮点击事件中调用我们的Log输出函数来输出信息,并且可以在点击Log信息时跳转到真正的错误代码行。

public class Example : MonoBehaviour
{
    void OnGUI()
    {
        if (GUILayout.Button("Test"))
        {
            DoTest();
        }
    }

    void DoTest()
    {
        DebugUtils.Log("Test Log");
        DebugUtils.Log("Test Log with Call Stack");
        SubMethod();
    }

    void SubMethod()
    {
        DebugUtils.Log("SubMethod Log");
    }
}

3. 总结

通过本文的讲解,我们学习了如何实现具有点击跳转功能的Log输出功能。我们首先封装了带有调用栈信息的Log输出函数,在输出Log信息的同时记录了当前代码的调用栈信息。然后,我们为Log信息添加了点击跳转功能,当我们点击Log信息时可以精确定位到代码错误的位置。在Unity开发中,具有点击跳转功能的Log输出是一个非常有用的工具,可以帮助我们快速定位错误并进行调试。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Unity输出带点击跳转功能的Log实现技巧详解 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 微软宣布.NET开源:Visual Studio支持Android了

    微软宣布.NET开源:Visual Studio支持Android了 简介 微软宣布.NET Framework将全面开源,并将.NET Core开源为Linux、Mac OS X和Windows的x86平台。Visual Studio 2015也增加了对Android和iOS的支持。这些举措将加强微软在移动领域的布局,推动.NET技术的普及。 .NET开源…

    C# 2023年6月3日
    00
  • c#动态执行脚本的3种方式详解

    C#动态执行脚本的3种方式详解 在C#中动态执行脚本是一种很常见的需求,在某些场景下它可以帮助我们实现更灵活的代码设计。本文将详细讲解C#中动态执行脚本的3种方式。 1. 使用CSharpCodeProvider CSharpCodeProvider 是 .NET Framework 类库中的一种类型,可以用来在运行时编译、执行C#代码。其主要思路是将用户提…

    C# 2023年5月31日
    00
  • 聊聊JS动画库 Velocity.js的使用

    下面是关于“聊聊JS动画库 Velocity.js的使用”的完整攻略: 什么是 Velocity.js Velocity.js是一款快速、高效、可扩展的动画库,由 Github 上的一个开发者编写。可以用它来对DOM元素进行各种复杂的动画操作,以增强用户体验。 安装 Velocity.js 你可以在官网上找到 Velocity.js 的CDN链接, 或者通过…

    C# 2023年6月1日
    00
  • 使用jQuery Uploader显示文件上传进度

    使用jQuery Uploader显示文件上传进度的完整攻略如下: 准备工作 在使用jQuery文件上传进度条之前,需要确保以下条件已经满足: 你已经安装了jQuery 你已经引入了jQuery Uploader插件 HTML结构 为了展示文件上传进度条,需要为文件上传添加一些HTML元素,如下所示: <input type="file&qu…

    C# 2023年6月1日
    00
  • 如何在.Net 7中将Query绑定到数组详解

    以下是关于“如何在 .NET 7 中将 Query 绑定到数组”的完整攻略: 1. 问题描述 在 .NET 7 中,我们经常需要将 Query 绑定到数组。但是,由 .NET 7 中的一些更改,可能会导致以前的方法不再适用。因此,我们需要了解如何在 .NET 7 中将 Query 绑定到数组。 2. 解决方案 要将 Query 绑定到数组,可以使用以下步骤:…

    C# 2023年5月12日
    00
  • C#操作注册表的方法详解

    C#操作注册表的方法详解 什么是注册表 注册表是Windows操作系统中的一个重要组成部分,用于存储系统和应用程序的各种配置信息,包括系统硬件、软件和用户设置等。其中,注册表是由一些键(key)和值(value)组成的,它们类似于树形结构的路径和对应的数据,我们可以通过访问这些键和值来获取和修改系统和应用程序的设置信息。 C#操作注册表的方法 在C#中,我们…

    C# 2023年5月15日
    00
  • ASP.NET Core MVC中的视图(Views)

    ASP.NET Core MVC中的视图(Views)是一项非常重要的功能,可以将网站的前端页面和后端数据交互结合在一起。下面是一份完整攻略,从基础知识开始,逐渐深入,包括示例说明。 什么是视图(Views)? ASP.NET Core MVC中的视图(Views)就像一个网站的HTML页面,它们被用来描述和呈现用户看到的内容。视图一般是网站的前端页面,负责…

    C# 2023年5月31日
    00
  • c#获取存储过程返回值示例分享

    当使用C#调用存储过程时,我们可以通过获取存储过程的返回值来判断该存储过程是否执行成功,例如返回0表示执行成功,而返回其他值则可能表示执行失败或者出现异常。 下面我们就来详细讲解如何通过C#获取存储过程的返回值。 示例一 在调用存储过程的时候,我们通过SqlCommand对象的ExecuteNonQuery()方法执行存储过程,该方法返回受影响的行数,而不是…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部