Warm tip: This article is reproduced from serverfault.com, please click

unity3d-Unity如何创建自定义控制台

(unity3d - Unity how to crate custom console)

发布于 2020-11-29 21:38:02

因此,我发现unity的控制台非常有限,它可以使用更多的功能和工具(例如,根据名称空间/类/类型/ extra过滤日志的方法,或使用命令的方法(在editor中,而不是在游戏本身)),所以我想自己制作一个游戏,但经过3天的研究,我没有发现任何可以对我有帮助的东西。

因此,我需要一些帮助以找到关于应该做什么或应该看什么的提示。

谢谢你。

Questioner
mahdi movahedian
Viewed
11
mahdi movahedian 2020-12-04 05:52:37

主要有两个问题。

  1. 如何获取日志。
  2. 如何具有日志回叫方法。

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

2_第二个StackTrace是我们需要使用(from LogEntry.StackTrace),这是给你这样的东西:

test
UnityEngine.MonoBehaviour:print(Object)
Test:OnStart() (at Assets/Scripts/Test.cs:40)

如你所见,(at Assets/Scripts/Test.cs:40)它既包含位置又包含线条,因此它可以与AssetDatabase.OpenAsset.here一起使用,这是一种使你的生活更轻松的方法。

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

现在,你可以在此之上执行任何所需的功能。