Unity的Log挟持点击,按alt,ctrl的功能定位代码

1.按ctrl点击Log_用文本编辑器打开Log内容_方便看(copy)文本内容
2.按alt点击Log_识别是否协议(proto),然后find到代码在哪行,并定位打开脚本__若全否,则使用原本的打开功能
3.普通打开_普通定义使用rider打开

using System;
using System.IO;
using System.Reflection;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEngine;

public static class LogTryAssist
{
    [OnOpenAsset(0)]
    private static bool OnOpenAsset(int insID, int line)
    {
        if (Event.current != null && Event.current.control)
        {
            var logContent = GetConsoleStackTrace();
            OpenInNotepadPlusPlus(logContent);
            return true;
        }
        if (Event.current != null && Event.current.alt)
        {//Alt 定位到协议
            var logContent = GetConsoleStackTrace();
            if (logContent.Contains("ProtoReplyEvent") && logContent.Contains("EventMgr.cs"))
            {
                string pattern = @"<color=[^>]+>([^<]+)</color>";
                string ser1 = "[Net((uint)Pb.Opcodes.";
                string ser2 = "[Net((uint)Pb.OpcodesL.";
                return TryOpenGoToScript(logContent,pattern,ser1,ser2);
            }
            else if(logContent.Contains("ProtoSendEvent") && logContent.Contains("EventMgr.cs"))
            {
                string pattern = @"<color=[^>]+>([^<]+)</color>";
                string ser1 = "NetMgr.Ins.Send((uint)Opcodes.";
                string ser2 = "NetMgr.Ins.Send((uint)OpcodesL.";
                return TryOpenGoToScript(logContent,pattern,ser1,ser2);
            }
            return false;
        }
        else
        {
            string assetPath = AssetDatabase.GetAssetPath(insID);
            var codeExe = EditorPrefs.GetString("kScriptsDefaultApp");
            if (codeExe.Contains("rider") && assetPath.EndsWith(".cs"))
            {
                var arguments = $"--line {line} {Path.GetFullPath(assetPath)}";
                System.Diagnostics.Process.Start(codeExe, arguments);
                return true;
            }
        }
        return false;
    }

    private static bool TryOpenGoToScript(string logContent,string pattern,string searchText,string searchText2)
    { //响应
        string directoryPath = $"{Application.dataPath}/Hotfix/Modules/";
        var GcName = Regex.Match(logContent, pattern);
        searchText = string.Format("{0}{1}", searchText, GcName.Groups[1].Value); // 目标文本
        int pLineNum = 0;
        var filePath = SearchTextInFiles(directoryPath, searchText, out pLineNum);
        if (string.IsNullOrEmpty(filePath))
        {
            searchText2 = string.Format("{0}{1}", searchText2, GcName.Groups[1].Value); // 目标文本
            filePath = SearchTextInFiles(directoryPath, searchText2, out pLineNum);
        }
        if (string.IsNullOrEmpty(filePath))
        {
            return false; //两种 sc 都没有找到
        }
        
        var codeExe = EditorPrefs.GetString("kScriptsDefaultApp");
        if (codeExe.Contains("rider") && filePath.EndsWith(".cs"))
        {
            var arguments = $"--line {pLineNum} {Path.GetFullPath(filePath)}";
            System.Diagnostics.Process.Start(codeExe, arguments);
            return true;
        }
        else if (codeExe.Contains("devenv") && filePath.EndsWith(".cs"))
        {
            var arguments = $"/edit \"{filePath}\" /command \"Edit.Goto {pLineNum}\"";//好像跳不到指定的行号
            System.Diagnostics.Process.Start(codeExe, arguments);
            return true;
        }
        return false;
    }

    // 搜索文件夹中所有文件的指定文本
    public static string SearchTextInFiles(string directoryPath, string searchText, out int pLineNum)
    {
        var files = Directory.GetFiles(directoryPath, "*.cs", SearchOption.AllDirectories); // 这里只搜索 C# 文件,可以修改搜索的文件类型
        foreach (var file in files)
        {
            int lineNumber = 1;
            foreach (var line in File.ReadLines(file))
            {
                if (line.Contains(searchText))
                {
                    Debug.Log($"找到其中一个文件: {file} ,在第{lineNumber}行 搜索文本: {searchText}");
                    pLineNum = lineNumber;
                    return file;
                }
                lineNumber++;
            }
        }
        pLineNum = -1;
        return string.Empty;
    }

    private static string GetConsoleStackTrace()
    {
        var consoleType = typeof(EditorWindow).Assembly.GetType("UnityEditor.ConsoleWindow");
        var conIns = consoleType.GetField("ms_ConsoleWindow", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null);
        if (conIns != null && EditorWindow.focusedWindow == conIns)
        {
            var textField = consoleType.GetField("m_ActiveText", BindingFlags.Instance | BindingFlags.NonPublic);
            return textField.GetValue(conIns).ToString();
        }

        return null;
    }

    private static void OpenInNotepadPlusPlus(string content)
    {
        string timestamp = DateTime.Now.ToString("MMdd_HHmmss");
        string tempFilePath = Path.Combine(Path.GetTempPath(), $"logContent_{timestamp}.txt");
        File.WriteAllText(tempFilePath, content);
        try
        {
            System.Diagnostics.Process.Start("notepad++.exe", $"{tempFilePath}"); // 尝试使用 Notepad++ 打开文件
        }
        catch
        {
            System.Diagnostics.Process.Start("notepad", $"{tempFilePath}"); // 如果 Notepad++ 打开失败,则使用 Notepad
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值