方案:
Unity的日志控制:
日志系统打开,但是只打印错误日志。这样其他级别的日志就不会有打印消耗。
UnityEngine.Debug.unityLogger.logEnabled = true;
Debug.unityLogger.filterLogType = LogType.Error;
但是还是有字符串拼接的消耗。
Conditional属性是一个C#特性,它允许你根据预处理器指令的定义来有条件地执行方法。例如下面的代码:
[Conditional("OPEN_MAIN_LOG_LOGWARNING")]
public static void Log(object message,Object context)
{
UnityEngine.Debug.Log(message,context);
}
如果没有OPEN_MAIN_LOG_LOGWARNING宏,编译的时候,所有调用Log的方法都会从Dll里去除。因此就没有了字符串拼接的消耗。
检查发现的问题:
- Unity Editor下的Debug函数不应该被替换
- 给ProjectStttings.asset文件修改宏的时候,应该全平台替换。
- 双击日志,非ILRuntime下和ILRuntime都能跳转到对应代码的行号。注意如果ILRuntime下加了
DISABLE_ILRUNTIME_DEBUG就不会有行号的打印。
using System.IO;
using System.Reflection;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditorInternal;
using UnityEngine;
/// <summary>
/// 日志重定向相关的实用函数。
/// </summary>
internal static class LogRedirection
{
private static readonly Regex LogRegex = new Regex(@" \(at (.+)\:(\d+)\)\r?\n");
[OnOpenAsset(0)]
private static bool OnOpenAsset(int instanceId, int line)
{
var scriptComponent = EditorUtility.InstanceIDToObject(instanceId);
string selectedStackTrace = GetSelectedStackTrace();
if (string.IsNullOrEmpty(selectedStackTrace))
{
return false;
}
//是ILRuntime下日志
if (selectedStackTrace.Contains("ILRuntime StackTrace"))
{
//如果跳转的不是我们的GalaDebugger,证明打开的不是第一行的url,让系统跳转
if (!scriptComponent.name.Contains("GalaDebugger"))
{
return false;
}
Match match = LogRegex.Match(selectedStackTrace);
if (!match.Success)
{
return false;

文章介绍了如何在Unity中控制日志系统,仅输出错误日志以减少性能消耗,并利用Conditional属性根据预处理器指令有条件地执行日志方法。此外,还讨论了UnityEditor下日志重定向的问题,确保在ILRuntime环境下能正确跳转到出错代码行,并提供了ILRuntime堆栈跟踪的实现方式。
最低0.47元/天 解锁文章
431

被折叠的 条评论
为什么被折叠?



