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
}
}
}