自定义非Unreal文件使用Unreal宏及generated.h相关报错排查
问题解答
关于你的两个疑问
- Unreal Header Tool(UHT)不区分文件是编辑器创建还是外部编写,只要文件里包含
UENUM/UCLASS/USTRUCT这类需要反射支持的宏,且满足UHT处理条件(比如正确引入generated.h、工程Build.cs包含该文件路径),就会被处理。 - 只要自定义头文件用了
UENUM/UCLASS等需要UHT生成反射代码的宏,就必须引入对应的[FileName].generated.h,而且这个include语句必须放在头文件的最后一行,确保所有依赖解析完成后再引入生成的代码。
解决枚举报错问题
你遇到的Error: Expected the name of a previously defined enum错误,大概率是UHT未正确处理枚举文件,或者枚举定义不符合Unreal要求,可按以下步骤排查:
- 修正枚举定义规范:
Unreal对UENUM修饰的枚举有明确要求,建议使用强类型枚举(enum class),同时遵循Unreal命名规范(枚举名以E开头),修改后的代码示例:
指定UENUM(BlueprintType, Category="Enums") enum class EMyEnum : uint8 { FIRST_ENTRY UMETA(DisplayName="First Entry"), SECOND_ENTRY UMETA(DisplayName="Second Entry") };uint8作为底层类型是Unreal常规做法,可避免内存浪费。 - 检查Build.cs配置:
确保工程Build.cs文件中,已将存放该头文件的目录添加到包含路径。如果头文件在Public文件夹的自定义子目录,需手动添加:PublicIncludePaths.AddRange(new string[] { "YourProject/Public/YourSubFolder" }); - 强制重新生成UHT代码:
关闭Visual Studio,右键点击Unreal工程文件(.uproject)选择Generate Visual Studio Files,重新打开工程编译。这一步可解决UHT缓存未更新导致的反射代码缺失问题。 - 确认头文件包含顺序:
确保File.generated.h是File.h的最后一行include,示例:#include "CoreMinimal.h" // 枚举定义 UENUM(BlueprintType, Category="Enums") enum class EMyEnum : uint8 { ... }; // 必须放在最后 #include "File.generated.h" - 调整属性声明:
Unreal 4.25及以上版本支持直接用强类型枚举声明属性,无需TEnumAsByte:
若使用旧版本Unreal,仍需保留UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Enums") EMyEnum EnumVariable;TEnumAsByte:UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Enums") TEnumAsByte<EMyEnum> EnumVariable;
内容的提问来源于stack exchange,提问作者Skyseed
相关产品推荐
相关产品推荐

