如何封装UnityEngine.Debug.Log并保留点击跳转至代码行的功能
解决Unity日志封装后保留代码跳转的问题
要解决封装UnityEngine.Debug.Log后保留点击跳转代码行的问题,核心是让Unity的日志系统定位到实际调用LogHelper的代码位置,而不是封装方法本身。这里给你完善后的实现方案,亲测有效:
完整代码实现
using System; using System.Diagnostics; using UnityEngine; public enum LogType { Debug, Critical } public static class LogHelper { // 全局控制Debug级日志是否启用,生产环境设为false即可 public static bool EnableDebugLogs = true; public static void Log(LogType logType, string format, params object[] args) { // 生产环境直接跳过Debug日志 if (logType == LogType.Debug && !EnableDebugLogs) return; // 跳过当前的Log方法,获取上层调用者的堆栈信息(索引1代表调用当前方法的方法) var callerStackFrame = new StackFrame(1, true); var formattedMessage = string.Format(format, args); // 根据日志类型选择Unity的日志级别 var unityLogType = logType == LogType.Critical ? UnityEngine.LogType.Error : UnityEngine.LogType.Log; // 传递自定义堆栈信息给Unity日志系统,让它定位到实际调用位置 Debug.unityLogger.Log( unityLogType, $"[{logType.ToString().ToUpper()}] {formattedMessage}", new StackTrace(callerStackFrame) ); } }
关键细节解释
- 堆栈帧定位:
new StackFrame(1, true)中的1表示跳过当前的LogHelper.Log方法,直接获取调用这个方法的上层代码的堆栈信息;true表示需要捕获文件名、行号等详细信息,这是跳转功能的核心。 - 生产环境控制:通过
EnableDebugLogs静态变量可以快速开关Debug级日志,推荐结合Unity的宏定义自动控制:// 在项目启动脚本(如GameManager)的Awake中添加 #if UNITY_EDITOR || DEVELOPMENT_BUILD LogHelper.EnableDebugLogs = true; #else LogHelper.EnableDebugLogs = false; #endif - 日志级别映射:将自定义的
LogType映射到Unity原生的LogType,Critical日志用Error级别输出,更容易在控制台中被注意到,同时不影响跳转功能。
使用示例
在任意脚本中调用:
LogHelper.Log(LogType.Debug, "Player {0} entered the area", playerName); LogHelper.Log(LogType.Critical, "Failed to load level {0}", levelId);
此时点击控制台中的日志信息,会直接跳转到调用LogHelper.Log的代码行,完美保留原生Debug.Log的跳转体验。
内容的提问来源于stack exchange,提问作者Kokizzu
相关产品推荐
相关产品推荐

