Unity3d Unity如何包装定制控制台

Unity3d Unity如何包装定制控制台,unity3d,debugging,console,Unity3d,Debugging,Console,所以我发现unity的控制台非常有限,它可以使用更多的功能和工具(比如基于名称空间/class/type/extra过滤日志的方法,或者使用命令的方法(在编辑器中,而不是在游戏本身中)),所以我想自己做一个,但是经过3天的研究,我没有发现任何对我有丝毫帮助的东西 所以我需要一些帮助来找到一个关于我应该做什么或者应该去哪里看的提示 谢谢。有两个主要问题 如何获取日志 如何使用日志回调方法 1_对于第一个问题,我们应该使用Application.logMessageReceived接收和存储日志

所以我发现unity的控制台非常有限,它可以使用更多的功能和工具(比如基于名称空间/class/type/extra过滤日志的方法,或者使用命令的方法(在编辑器中,而不是在游戏本身中)),所以我想自己做一个,但是经过3天的研究,我没有发现任何对我有丝毫帮助的东西

所以我需要一些帮助来找到一个关于我应该做什么或者应该去哪里看的提示


谢谢。

有两个主要问题

  • 如何获取日志
  • 如何使用日志回调方法

  • 1_对于第一个问题,我们应该使用
    Application.logMessageReceived
    接收和存储日志

    public class Test : MonoBehaviour
    {
    
        public static List<LogEntry> Logs = new List<LogEntry>();
    
        void Start()
        {
            //Remove it ones , just in case
            Application.logMessageReceived -= HandleLog;
            Application.logMessageReceived += HandleLog;
        }
    
        private static void HandleLog(string logString, string stackTrace, LogType type)
        {
            Logs.Add(new LogEntry(logString, stackTrace, type));
        }
    }
    
    [Serializable]
    public class LogEntry
    {
    
        public string Message;
        public string StackTrace;
        public LogType Type;
    
        // You can not remove this
        public LogEntry() { }
    
        public LogEntry(string message, string stackTrace, LogType type)
        {
            Message = message;
            StackTrace = stackTrace;
            Type = type;
        }
    }
    
    正如您所看到的
    (位于Assets/Scripts/Test.cs:40)
    包含位置和行,因此它可以与
    AssetDatabase.OpenAsset
    一起使用。以下是一种让您的生活更轻松的方法

    public static void LogCallback(string stackTrace)
    {
        int startingPoint = stackTrace.IndexOf("Assets/", StringComparison.Ordinal);
        int middlePoint = stackTrace.IndexOf(":", startingPoint, 
        StringComparison.Ordinal);
        int finalPoint = stackTrace.IndexOf(")", middlePoint, StringComparison.Ordinal);
    
        string adders = stackTrace.Substring(startingPoint, middlePoint - startingPoint);
        
        int lineNumber = Int32.Parse(stackTrace.Substring(middlePoint + 1, finalPoint - middlePoint - 1));
    
        AssetDatabase.OpenAsset(AssetDatabase.LoadAssetAtPath<MonoScript>(adders), lineNumber); 
    }
    
    publicstaticvoidlogcallback(字符串stackTrace)
    {
    int startingPoint=stackTrace.IndexOf(“Assets/”,StringComparison.Ordinal);
    int middlePoint=stackTrace.IndexOf(“:”,起始点,
    比较(序数);
    int finalPoint=stackTrace.IndexOf(“)”,中间点,StringComparison.Ordinal);
    字符串加法器=stackTrace.Substring(起始点、中点-起始点);
    int lineNumber=Int32.Parse(stackTrace.Substring(middlePoint+1,finalPoint-middlePoint-1));
    OpenAsset(AssetDatabase.LoadAssetPath(加法器),行号);
    }
    

    现在,您可以在此基础上实现任何功能。

    难道还没有足够的功能可以做到这一点吗?;)没有任何有用的东西。我知道有一些完全支持您命名的东西(按名称空间、类型、自定义标记过滤日志),我并没有真正理解您所说的
    命令的意思,但有多种Unity内置方式,用于通过按钮单击等触发方法。)但是,现在知道您已经知道了一些资产:是的,您可以创建一个自定义控制台。你只需要一个
    EditorWindow
    ,然后通过一个监听器来填充它,剩下的只是让你通过API^^^和如何使用调用堆栈?我有堆栈跟踪,但我不知道如何使用它(如何打开日志(比如双击控制台中的日志时发生的事情))
    public static void LogCallback(string stackTrace)
    {
        int startingPoint = stackTrace.IndexOf("Assets/", StringComparison.Ordinal);
        int middlePoint = stackTrace.IndexOf(":", startingPoint, 
        StringComparison.Ordinal);
        int finalPoint = stackTrace.IndexOf(")", middlePoint, StringComparison.Ordinal);
    
        string adders = stackTrace.Substring(startingPoint, middlePoint - startingPoint);
        
        int lineNumber = Int32.Parse(stackTrace.Substring(middlePoint + 1, finalPoint - middlePoint - 1));
    
        AssetDatabase.OpenAsset(AssetDatabase.LoadAssetAtPath<MonoScript>(adders), lineNumber); 
    }