Unity 实现 Log 实时输出到屏幕或控制台(二)
ABSTRACT
CSDN 2015 年文章(cartzhang)。让 Unity(PC 平台)把日志输出到独立 Windows 控制台窗口:通过 kernel32 的 AllocConsole/AttachConsole 创建控制台、Console.SetOut 重定向输出,另配 ConsoleInput 处理键盘输入;并给出用 AssetPostprocessor 动态改写 sln/csproj 目标框架版本以解决 System.Console API 编译问题的技巧。
核心要点
- 动机:独立控制台不占 Unity 自身的 GUI 渲染,日志显示开销小、更灵活。
- ConsoleWindow 封装:先 AttachConsole 附加已有控制台,失败则 AllocConsole 新建;拿到 STD_OUTPUT_HANDLE 包成 FileStream/StreamWriter 后 Console.SetOut 重定向;Shutdown 时恢复并 FreeConsole。
- ConsoleInput 封装:轮询 Console.KeyAvailable 读键,处理 Enter/Backspace/Escape,维护 inputString 并通过事件 OnInputText 抛出——控制台可兼任简易命令行。
- 编译坑:Unity 5 默认 .NET 3.5 Subset,System.Console 大量成员找不到;Player Settings 改 .NET 2.0 可解,或用 AssetPostprocessor 在 OnPostprocessAllAssets 里把 sln/csproj 的 ToolsVersion/TargetFrameworkVersion 字符串替换升级(代码放 Editor 目录,用宏开关)。
- 测试效果:Debug.Log 与 System.Console.WriteLine 双通道输出到控制台,且写日志不再卡游戏渲染。
关键实体与概念
AllocConsole、AttachConsole、Console.SetOut、DllImport kernel32、重定向输出、AssetPostprocessor、TargetFrameworkVersion、控制台命令输入
关联概念
(无合适概念页,留空)
来源回溯
- 原始文件:
raw/gamedev/unity-实现log实时输出到屏幕或控制台上-二-csdn博客.md(evernote/FW-游戏3研发技术 导入)
时效性评估
- 仍有效:Windows 下 P/Invoke 附加控制台的技巧仍可用于 PC 包调试。
- 已过时:仅覆盖 Windows + Mono 场景;现代更常用游戏内控制台插件(In-game Debug Console、QConsole)、文件日志 + 实时采集或编辑器远程调试,跨平台且无需改工程文件。