因此,我发现unity的控制台非常有限,它可以使用更多的功能和工具(例如,根据名称空间/类/类型/ extra过滤日志的方法,或使用命令的方法(在editor中,而不是在游戏本身)),所以我想自己制作一个游戏,但经过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;
}
}
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);
}
现在,你可以在此之上执行任何所需的功能。