Unity如何创建自定义控制台
Unity how to crate custom console
所以我发现 unity 的控制台非常有限,它可以使用更多的功能和工具(比如基于 namespace/class/type/extra 过滤日志的方法,或者使用命令的方法(在编辑器中,不在游戏本身)),所以我想自己做一个,但经过 3 天的研究,我没有发现任何可以帮助我丝毫的东西。
所以我需要一些帮助来找到有关我应该做什么或应该去哪里看的提示。
谢谢。
主要有两个问题。
- 如何获取日志。
- 如何有一个日志回调方法。
1_For第一个问题我们应该使用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_For 第二个 StackTrace
是我们需要使用的(来自 LogEntry.StackTrace
),它给你这样的东西:
test
UnityEngine.MonoBehaviour:print(Object)
Test:OnStart() (at Assets/Scripts/Test.cs:40)
如您所见,(at 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);
}
现在您可以在此基础上创建任何您想要的功能。
所以我发现 unity 的控制台非常有限,它可以使用更多的功能和工具(比如基于 namespace/class/type/extra 过滤日志的方法,或者使用命令的方法(在编辑器中,不在游戏本身)),所以我想自己做一个,但经过 3 天的研究,我没有发现任何可以帮助我丝毫的东西。
所以我需要一些帮助来找到有关我应该做什么或应该去哪里看的提示。
谢谢。
主要有两个问题。
- 如何获取日志。
- 如何有一个日志回调方法。
1_For第一个问题我们应该使用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_For 第二个 StackTrace
是我们需要使用的(来自 LogEntry.StackTrace
),它给你这样的东西:
test
UnityEngine.MonoBehaviour:print(Object)
Test:OnStart() (at Assets/Scripts/Test.cs:40)
如您所见,(at 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);
}
现在您可以在此基础上创建任何您想要的功能。