如何将Unity中Debug.Log打印的内容在场景内以文本形式展示
Unity 控制台日志转场景内文本展示实现方案
核心实现原理
Unity 提供了全局日志回调接口 Application.logMessageReceived(主线程触发,适合直接操作UI),可以捕获所有 Debug.Log/Debug.LogWarning/Debug.LogError 输出的内容,无需修改原有项目的日志打印代码。
基础实现步骤
- 第一步:创建场景内文本展示容器
优先使用 TextMeshPro - Text (UGUI) 组件作为日志展示载体,搭配Scroll Rect组件实现长日志滚动查看,也可以使用旧版 UGUIText组件。如果需要展示多行日志,建议将文本组件放在滚动视口的内容节点下。 - 第二步:编写日志捕获绑定脚本
创建新的C#脚本,示例代码如下:
如果使用旧版UGUI Text组件,只需将代码中的using UnityEngine; using TMPro; // 如果使用旧版UGUI Text,替换上方命名空间为 using UnityEngine.UI; public class InGameConsole : MonoBehaviour { // Inspector中拖拽绑定场景内的文本组件 public TextMeshProUGUI logText; // 最大日志存储条数,超过后自动删除最早的一条 public int maxLogCount = 50; private void OnEnable() { // 注册全局日志回调 Application.logMessageReceived += HandleLog; } private void OnDisable() { // 注销回调,避免内存泄漏 Application.logMessageReceived -= HandleLog; } private void HandleLog(string logString, string stackTrace, LogType type) { // 可选:根据日志类型加颜色标记,需开启文本组件的Rich Text选项 string coloredLog = type switch { LogType.Error => $"<color=red>[错误] {logString}</color>", LogType.Warning => $"<color=yellow>[警告] {logString}</color>", _ => $"[信息] {logString}" }; // 拼接新日志到原有内容开头/末尾 logText.text = $"{coloredLog}\n{logText.text}"; // 超出最大条数时裁剪掉最早的日志 string[] logLines = logText.text.Split('\n'); if (logLines.Length > maxLogCount) { logText.text = string.Join("\n", logLines, 0, maxLogCount); } } }TextMeshProUGUI替换为Text即可。 - 第三步:挂载脚本并绑定组件
将上述脚本挂载到场景内持久存在的对象上(比如全局管理器对象),在Inspector面板中将之前创建的文本组件拖拽到logText字段,运行项目即可看到所有Debug输出自动同步到场景文本中。
可选优化方案
- 若需要捕获程序运行过程中的崩溃异常日志,可以替换回调为
Application.logMessageReceivedThreaded,注意该回调可能在子线程触发,操作UI需要先抛到主线程执行。 - 可以添加日志筛选按钮,分别控制信息、警告、错误日志的显示与隐藏。
- 增加点击单条日志展示完整堆栈信息的交互逻辑,方便排查问题。
- 日志内容过多时开启文本的自动裁切,避免单帧文本渲染开销过高。
内容的提问来源于stack exchange,提问作者Lorenzo Sindoni
相关产品推荐
相关产品推荐

