
1. 为什么我不再用 Rider 和 Visual Studio 写 UE5 项目先说结论UE5 项目用 VS Code 开发不是能不能的问题而是怎么配才不折腾的问题。我从 UE4.26 时代就开始尝试把 UE 的开发环境从 Visual Studio 迁移到 VS Code中间踩过的坑包括 IntelliSense 疯狂报红、编译任务找不到 UBT、调试器附加不上、Live Coding 控制台没输出等等。到现在 UE5.3 之后的版本这套流程已经相当稳定了日常写 C 和蓝图混合项目完全够用。这篇文章面向三类人一是机器配置一般、开 Visual Studio 就卡到怀疑人生的开发者二是习惯了 VS Code 生态、不想为了 UE 单独切换编辑器的人三是想搞清楚 UE5 构建系统底层逻辑、不想被 IDE 黑盒绑架的人。我会从环境准备、插件选型、编译任务配置、调试器接入、常见报错排查几个维度把整套流程拆开讲清楚每一步都告诉你为什么这么做而不是丢一堆配置文件让你抄。需要提前说明的是UE5 的 C 开发本质上依赖的是UnrealBuildToolUBT和UnrealHeaderToolUHT这套命令行工具链IDE 只是外壳。Visual Studio 之所以开箱即用是因为 Epic 官方给它写了专门的插件Visual Studio Tools for Unreal Engine来对接这套工具链。VS Code 没有官方插件所以我们需要手动把 UBT 的编译任务、调试器的启动参数、IntelliSense 的包含路径这三件事配好。理解了这一点后面所有配置就都顺理成章了。2. 环境准备与工具链梳理2.1 前置依赖清单在动手配 VS Code 之前有几样东西必须先装好否则后面会各种报错。我把它们列成表格方便你对照检查组件版本要求作用备注Unreal Engine 55.1 及以上引擎本体建议 5.3构建系统更稳定Visual Studio 2022社区版即可提供 MSVC 编译器和 Windows SDK必须装使用 C 的游戏开发工作负载VS Code最新稳定版代码编辑器建议 1.85.NET SDK6.0 或 8.0UBT 运行依赖UE5.3 之后用 .NET 6Windows SDK10.0.18362 以上编译 Windows 平台目标装 VS 时勾选这里有个很多人忽略的点即使你完全不用 Visual Studio 写代码也必须装它。原因是 UE5 的 UBT 在 Windows 平台下默认调用 MSVC 的编译器cl.exe和链接器而这些工具链是随 Visual Studio 一起安装的。你可以不打开 VS但不能不装它。我见过有人为了纯净环境只装 Build Tools结果 UBT 找不到工具链报Unable to find a valid Visual Studio installation折腾半天。提示安装 Visual Studio 时工作负载只勾使用 C 的游戏开发就够了单个组件里确保勾上Windows 10/11 SDK和MSVC v143 生成工具。不需要勾 .NET 桌面开发那些省几个 G 空间。2.2 VS Code 必装扩展扩展不在多在于精准。UE5 C 开发我实际用下来这几个是刚需C/CMicrosoft 官方提供 IntelliSense、调试器cppvsdbg、代码导航。这是核心没有它 VS Code 就是个记事本。C/C Extension Pack包含 CMake Tools 等虽然 UE 不用 CMake但里面的一些辅助工具挺方便。Unreal Engine 4/5 Snippets提供 UPROPERTY、UFUNCTION 等宏的代码片段写反射标记时省事。EditorConfig for VS Code统一代码风格UE 官方有 .editorconfig 文件装上能自动对齐缩进。GitLensUE 项目文件多看 git blame 和提交历史很有用。至于网上热传的什么 AI 代码补全插件我个人建议在 UE 项目里谨慎使用。UE 的宏和模板代码比如GENERATED_BODY()、TSubclassOf比较特殊很多补全工具会给出错误建议反而干扰。等你把基础环境跑通了再考虑加。2.3 生成项目文件一切的起点UE5 项目在 VS Code 里能正常工作的前提是项目目录下存在.vscode文件夹和正确的编译数据库。而这两样东西都需要通过 UBT 生成。操作路径是这样的在 Epic Games Launcher 里找到你的引擎版本点引擎右侧的下拉菜单选择选项确认勾选了引擎源码如果你要调试引擎代码的话。然后对你的.uproject文件右键选择Generate Visual Studio project files。这一步会调用 UBT 生成.sln和.vcxproj文件。很多人会问我不用 VS为什么还要生成 VS 项目文件因为 UBT 生成的这些文件里包含了完整的编译配置信息VS Code 的 C/C 扩展可以通过读取这些信息来构建 IntelliSense 数据库。换句话说.vcxproj是 UBT 和 VS Code 之间的桥梁。生成完成后你会在项目根目录看到YourProject.sln、Intermediate/ProjectFiles/等目录。接下来打开 VS Code用打开文件夹的方式打开项目根目录注意是根目录不是 .sln 文件。3. 核心配置让 IntelliSense 不再报红3.1 c_cpp_properties.json 的正确写法IntelliSense 报红是新手最崩溃的问题。满屏红波浪线但项目明明能编译通过。根本原因是 VS Code 的 C/C 扩展不知道 UE 的头文件在哪、不知道那些宏是什么意思。解决办法是在.vscode/c_cpp_properties.json里配置包含路径和宏定义。但 UE 项目的包含路径动辄上百条手写不现实。这里有个技巧直接从 UBT 生成的 .vcxproj 文件里提取。我实际用的配置长这样{ configurations: [ { name: Win64, includePath: [ ${workspaceFolder}/Source/**, ${workspaceFolder}/Intermediate/**, C:/Program Files/Epic Games/UE_5.3/Engine/Source/**, C:/Program Files/Epic Games/UE_5.3/Engine/Intermediate/** ], defines: [ UNICODE, _UNICODE, __UNREAL__, PLATFORM_WINDOWS1, WITH_EDITOR1, UE_BUILD_DEVELOPMENT1 ], compilerPath: C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/cl.exe, cStandard: c17, cppStandard: c20, intelliSenseMode: windows-msvc-x64, compileCommands: ${workspaceFolder}/.vscode/compile_commands.json } ], version: 4 }关键点在于compileCommands这一项。如果你能生成compile_commands.jsonC/C 扩展会优先用它比手动配 includePath 精准得多。生成方法后面讲。defines里的宏也很重要。__UNREAL__让一些条件编译代码走对分支WITH_EDITOR1决定编辑器相关代码是否参与 IntelliSense 分析。少了这些很多引擎头文件会解析失败。3.2 用 compile_commands.json 提升精度compile_commands.json是 Clang 工具链的标准编译数据库格式记录了每个源文件的完整编译命令。UE5 从 5.0 开始支持通过 UBT 生成这个文件。命令是这样的在项目根目录执行C:\Program Files\Epic Games\UE_5.3\Engine\Build\BatchFiles\Build.bat YourProjectEditor Win64 Development -ProjectC:\Path\To\YourProject.uproject -WaitMutex -FromMsBuild -compdb -compdbformatjson执行完后compile_commands.json会生成在Intermediate/目录下。把它复制到.vscode/目录然后在c_cpp_properties.json里指向它。注意这个命令每次改动了模块依赖比如在 .Build.cs 里加了新模块后都要重新跑一遍否则 IntelliSense 会漏掉新模块的头文件路径。我一般把它写成一个 .bat 脚本改完 Build.cs 就双击跑一下。3.3 处理 UE 宏导致的误报即使配好了包含路径UE 的一些宏还是会让 IntelliSense 犯迷糊。最典型的是UPROPERTY()、UFUNCTION()、GENERATED_BODY()这些反射宏。C/C 扩展不认识它们会把它们当成未定义的标识符。解决办法是在defines里加一个__INTELLISENSE__宏然后在代码里用条件编译绕过。不过更省事的做法是接受这些误报。因为 UHTUnrealHeaderTool会在编译前处理这些宏实际编译是没问题的。你只需要在 VS Code 设置里把错误波浪线的显示级别调低或者用// NOLINT注释临时压制。我个人的经验是配好compile_commands.json之后90% 的误报都会消失剩下的基本就是反射宏相关的习惯就好。4. 编译任务把 UBT 接进 VS Code4.1 tasks.json 配置编译任务VS Code 的编译任务通过.vscode/tasks.json定义。UE 项目的编译本质就是调用 UBT所以任务配置就是把 UBT 的命令行封装一下。我的配置如下{ version: 2.0.0, tasks: [ { label: Build Editor (Development), type: shell, command: C:/Program Files/Epic Games/UE_5.3/Engine/Build/BatchFiles/Build.bat, args: [ YourProjectEditor, Win64, Development, -Project${workspaceFolder}/YourProject.uproject, -WaitMutex, -FromMsBuild ], group: { kind: build, isDefault: true }, problemMatcher: $msCompile, presentation: { echo: true, reveal: always, panel: shared } }, { label: Rebuild Editor, type: shell, command: C:/Program Files/Epic Games/UE_5.3/Engine/Build/BatchFiles/Build.bat, args: [ YourProjectEditor, Win64, Development, -Project${workspaceFolder}/YourProject.uproject, -WaitMutex, -FromMsBuild, -Clean ], problemMatcher: $msCompile } ] }几个参数解释一下YourProjectEditor是目标名对应你项目里Source/YourProject.Target.cs中定义的目标。Win64是平台Development是配置。-WaitMutex防止多个 UBT 实例同时跑导致文件锁冲突。-FromMsBuild让输出格式更规整方便 problemMatcher 解析错误。problemMatcher设为$msCompile后编译错误会直接显示在 VS Code 的问题面板里点击能跳转到对应代码行。这个体验比在终端里翻日志强太多。4.2 快捷键绑定与一键编译配好任务后按CtrlShiftB就能触发默认编译任务。但 UE 项目经常需要在编译编辑器和编译游戏之间切换我建议再绑几个快捷键。在.vscode/keybindings.json里加[ { key: ctrlshifte, command: workbench.action.tasks.runTask, args: Build Editor (Development) }, { key: ctrlshiftr, command: workbench.action.tasks.runTask, args: Rebuild Editor } ]这样CtrlShiftE编译CtrlShiftR全量重建比去菜单里点快得多。4.3 Live Coding 与热重载的配合UE5 的 Live Coding 是个好东西改完 C 代码按CtrlAltF11就能热重载不用重启编辑器。但它和 VS Code 的编译任务是两套机制Live Coding 走的是引擎内部的编译流程VS Code 的 task 走的是 UBT 命令行。我的建议是日常小改动用 Live Coding大改动改头文件、加新类、改模块依赖用 VS Code 的 task 全量编译。因为 Live Coding 对头文件改动的支持有限改了.h文件经常需要重启编辑器才能生效。实操心得Live Coding 编译时VS Code 的 IntelliSense 数据库不会自动更新。如果你加了新函数代码里会报未定义但实际能编译通过。这时候手动跑一次compile_commands.json生成命令或者重启一下 C/C 扩展命令面板搜 C/C: Reset IntelliSense Database就好了。5. 调试配置断点、附加、变量查看5.1 launch.json 接入调试器VS Code 调试 UE 项目用的是 Microsoft 的 C/C 扩展自带的cppvsdbg调试器。配置写在.vscode/launch.json{ version: 0.2.0, configurations: [ { name: Launch UE5 Editor (Debug), type: cppvsdbg, request: launch, program: C:/Program Files/Epic Games/UE_5.3/Engine/Binaries/Win64/UnrealEditor.exe, args: [ ${workspaceFolder}/YourProject.uproject, -game, -log ], stopAtEntry: false, cwd: ${workspaceFolder}, environment: [], console: externalTerminal, visualizerFile: C:/Program Files/Epic Games/UE_5.3/Engine/Extras/VisualStudioDebugging/Unreal.natvis }, { name: Attach to UE5 Editor, type: cppvsdbg, request: attach, processId: ${command:pickProcess} } ] }visualizerFile这一项是精髓。UE 引擎自带一个Unreal.natvis文件它告诉调试器怎么漂亮地显示 UE 的容器类型比如TArray、TMap、FString。没有它你在调试窗口里看到的FString就是一坨内存地址根本没法看。args里的-game表示以游戏模式启动不带编辑器 UI调试游戏逻辑时用这个。如果要调试编辑器本身去掉-game就行。5.2 附加到运行中的编辑器更常用的场景是编辑器已经开着我想调试某个函数。这时候用 Attach to UE5 Editor 配置按 F5 后会弹出进程列表选UnrealEditor.exe就行。附加调试有个坑必须确保你编译的是 Debug 或 Development 配置且带调试符号。如果你编译的是 Shipping 配置符号被剥离了断点根本打不上。UE 默认的 Development 配置是带符号的放心用。5.3 断点不生效的排查思路断点打上去是空心圆灰色说明调试器没找到对应的符号文件。排查顺序确认编译配置是 Development 或 Debug不是 Shipping。确认UnrealEditor.exe和你的模块.pdb文件在同一目录或符号路径能找到。确认附加的进程是对的有时候开了多个编辑器实例。检查代码是否真的被编译进去了——有时候改了代码没重新编译断点自然打不上。我遇到最多的情况是第 4 种。UE 项目模块多有时候只编译了部分模块你以为改了其实跑的还是旧代码。养成改完代码先编译再调试的习惯。6. 常见问题与排查速查表6.1 IntelliSense 相关现象原因解决满屏红波浪线包含路径缺失生成 compile_commands.json 并配置宏报未定义反射宏不被识别加__INTELLISENSE__宏或忽略跳转定义失效数据库未建立重置 IntelliSense 数据库补全卡顿项目太大限制 includePath 范围排除 Intermediate6.2 编译相关现象原因解决UBT 找不到 VS工具链未安装装 VS 2022 游戏开发工作负载编译报 mutex 错误多实例冲突加-WaitMutex参数改了 .h 不生效Live Coding 限制全量编译并重启编辑器链接错误 LNK2019模块依赖缺失检查 .Build.cs 的依赖列表6.3 调试相关现象原因解决断点是空心圆符号未加载确认编译配置带符号变量显示乱码natvis 未加载配置 visualizerFile附加进程失败权限不足以管理员身份运行 VS Code调试卡死断点太多减少断点用条件断点6.4 独家避坑技巧说几个文档里不会写、但我实际踩过的坑第一路径里的空格和中文。UE 的 UBT 对路径中的空格处理还算 OK但对中文路径支持很差。如果你的项目路径里有中文编译大概率会失败。我建议所有 UE 项目都放在纯英文、无空格的路径下比如D:\UEProjects\MyGame。第二杀毒软件拖慢编译。Windows Defender 实时扫描会严重拖慢 UBT 的编译速度尤其是大项目。把项目目录和引擎目录加入排除列表编译速度能快 30% 以上。第三VS Code 的工作区设置。如果你同时开多个 UE 项目建议用多根工作区Multi-root Workspace每个项目一个文件夹避免 IntelliSense 数据库互相干扰。第四定期清理 Intermediate。UE 的 Intermediate 目录会越积越大有时候还会因为缓存导致奇怪的编译错误。遇到莫名其妙的编译失败先删掉Intermediate/和Saved/目录重新生成能解决一半问题。7. 我个人的实际使用体会这套配置我从 UE5.1 一直用到 5.4中间经历过几次引擎升级导致的配置失效但整体框架没变过。VS Code 写 UE 的体验说实话在纯 C 代码编辑和导航上比 Visual Studio 轻快不少尤其是机器配置一般的时候开 VS 那个加载速度真的劝退。但它也有明显的短板蓝图和 C 的混合调试不如 VS 顺畅UE 的一些编辑器专用工具比如蓝图调试器、性能分析器在 VS Code 里没有对应集成。所以我的实际工作流是日常写 C 用 VS Code需要深度调试蓝图或做性能分析时切回 Visual Studio。两个 IDE 共用同一套 UBT 工具链项目文件是通用的切换成本很低。最后分享一个小技巧把常用的 UBT 命令编译、生成项目文件、清理都写成.bat脚本放在项目根目录然后在 VS Code 的 tasks.json 里引用这些脚本。这样即使换了引擎版本只需要改脚本里的引擎路径tasks.json 不用动。这个习惯帮我省了不少升级时的重复劳动。