先确保生成compilecommands.json:运行ubt命令生成,检查路径是否为intermediate/build/compilecommands.json;再配置clangd插件并指定compile-commands-dir;最后添加generated.h所在inc目录到includepath以支持ufunction识别。

Unreal Engine 项目在 VSCode 中没有 C++ 智能提示?先检查 CompileCommands.json 是否生成
VSCode 本身不理解 Unreal 的构建逻辑,C++ 插件(如 C/C++ 官方插件或 clangd)必须依赖准确的编译数据库才能提供函数跳转、参数提示和宏展开。Unreal 默认不生成 CompileCommands.json,这是 90% 用户没补全的根本原因。
- 确保用命令行生成:在项目根目录下运行
UnrealBuildTool.exe -projectfiles -project="YourProject.uproject" -game -engine(Windows)或对应平台的UBT调用 - 生成后检查是否在
Intermediate/Build/<code> 目录下出现 <code>CompileCommands.json(注意:不是CompileCommands.txt) - 如果路径含空格或中文,clangd 可能静默失败——建议项目路径纯英文、无空格
- C/C++ 插件需在
c_cpp_properties.json中显式指定"compileCommands": "${workspaceFolder}/Intermediate/Build/CompileCommands.json"
clangd 还是 Microsoft C/C++ 插件?选 clangd 更稳
Unreal 大量使用模板、宏和自定义属性(UCLASS、UPROPERTY),Microsoft 的 cpptools 对非标准语法支持弱,常卡在 UObject 继承链解析上;clangd 基于真实 Clang AST,兼容性更好,尤其配合 -Xclang -fms-extensions 等 UE 构建参数时更准。
- 安装
clangd插件(官方 LLVM 发布版),禁用cpptools避免冲突 - 在
settings.json中配置"clangd.arguments",至少包含:["--compile-commands-dir=Intermediate/Build", "--background-index"] - 若提示 “no compile commands found”,说明 clangd 没定位到
CompileCommands.json—— 用clangd --check=<path></path>手动验证路径有效性 - 不要开启
"clangd.fallbackFlags"自动推导,UE 的 include 路径太深,容易漏掉Engine/Source/Runtime/Core/Public等关键头文件
为什么 UFUNCTION 或 UPROPERTY 成员不被识别?别指望自动解析宏
clangd 和 cpptools 都不会执行 UE 的 UHT(Unreal Header Tool)预处理,所以 UFUNCTION(BlueprintCallable) 这类宏包裹的函数,在源码里就是“不存在”的——智能提示只认 UHT 输出后的 *.generated.h 文件,但这些文件默认不在 VSCode 工作区中。
- 手动把
Intermediate/Build/<code> 下对应 Target 的 <code>Inc/YourModule/目录加入"includePath"(clangd 不认这个,但 cpptools 需要) - 更可靠的做法:在
.vscode/c_cpp_properties.json的includePath中添加"${workspaceFolder}/Intermediate/Build/*/*/Inc/**"(注意通配符层级) - 即便如此,
BlueprintCallable函数仍可能不显示蓝图侧签名——这是正常现象,UHT 生成逻辑不在编辑器感知范围内 - 想查某个 UFUNCTION 实际声明?直接跳转到对应
*.generated.h,那里有 UHT 展开后的完整 C++ 签名
改完 C++ 代码后提示没更新?重启 clangd 索引比重启 VSCode 有效
clangd 启动后会缓存 AST,但 UE 每次重新生成 CompileCommands.json(比如加了新模块、改了 Build.cs)时,它不会自动 reload,导致提示停留在旧状态,甚至报错“symbol not found”。
- 快捷键
Ctrl+Shift+P→ 输入clangd: Restart language server强制刷新 - 如果频繁增删模块,建议在
tasks.json中加一个 task,自动运行 UBT 生成 + clangd 重启 - 留意右下角 clangd 状态栏图标:灰色表示未就绪,黄色表示索引中,绿色才是可用;点它可看当前加载的
CompileCommands.json路径 - 不要依赖 “自动重载” 选项——UE 的构建产物路径动态性强,clangd 的文件监听容易漏掉
Intermediate下的变更
CompileCommands.json 里每条命令的 -I 和 -D 是否真包含了你正在写的那个类所需的全部宏和头文件路径。UE 的模块依赖链一深,少一个 -I,整个类就变灰。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











