在虚幻引擎(Unreal Engine)中,编译时生成的元数据(Generated Metadata) 是通过 Unreal Header Tool (UHT) 生成的一组结构化数据,用于描述代码中的类、函数、属性等信息这些元数据是引擎反射系统(Reflection System)的核心,使得虚幻引擎能够在运行时动态识别和操作 C++ 代码中定义的类型和功能,从而实现以下关键功能:
元数据的内容
元数据包含以下关键信息:
-
类的信息:
- 类名、父类、所属模块(Module)
- 是否可在蓝图中使用(BlueprintType、Blueprintable)
- 类的分类标签(Category)
-
函数的信息:
- 函数名、参数类型、返回值类型
- 函数是否暴露给蓝图(BlueprintCallable、BlueprintPure)
- 函数的分类标签(Category)、工具提示(Tooltip)
- 输入/输出参数的元数据(例如参数是否显示在编辑器节点中)
-
属性的信息:
- 变量名、类型、默认值
- 是否可编辑(EditAnywhere)、是否暴露给蓝图(BlueprintReadWrite)
- 属性的分类标签和工具提示
-
其他标记:
- 网络同步规则(Replicated)
- 序列化规则(SaveGame)
- 编辑器行为(AdvancedDisplay 隐藏复杂参数)
可见Generated Metadata包含了Specifiers、Metadata和其他反射信息
元数据是如何生成的?
-
通过宏标记代码:
在 C++ 中,使用 UCLASS(), UFUNCTION(), UPROPERTY() 等宏标记类、函数和属性
示例:
UCLASS(Blueprintable)
class UMyClass : public UObject {
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Gameplay")
float Health;
UFUNCTION(BlueprintCallable, Category="Actions")
void Heal(float Amount);
};
-
Unreal Header Tool (UHT) 处理:
在编译时,UHT 会扫描代码中的宏标记,解析这些标记并生成对应的元数据(存储在 .generated.h 文件中)
这些元数据以结构化的形式(如 JSON 或二进制数据)嵌入到生成的代码中 -
引擎运行时使用:
元数据在引擎启动时加载,供反射系统使用
蓝图编辑器、动画蓝图、行为树等工具通过反射系统读取元数据,动态生成可调用的函数节点、可编辑的属性等
元数据的作用
-
蓝图与 C++ 的交互:
- 通过元数据,蓝图系统知道哪些 C++ 函数可以被调用(BlueprintCallable),哪些属性可以读写(
BlueprintReadWrite) - 例如,一个标记为 UFUNCTION(BlueprintCallable)的函数会出现在蓝图的节点菜单中
- 通过元数据,蓝图系统知道哪些 C++ 函数可以被调用(BlueprintCallable),哪些属性可以读写(
-
编辑器工具集成:
- 元数据决定了属性在编辑器中的显示方式(如分类、工具提示、范围限制)
- 例如,UPROPERTY(EditAnywhere, Category="Stats", meta=(ClampMin=0)) 会让属性在编辑器中的输入框限制最小值
-
序列化与网络同步:
- 元数据定义了哪些属性需要被保存(
SaveGame)或同步到客户端(Replicated)
- 元数据定义了哪些属性需要被保存(
-
动态类型检查:
- 在运行时,引擎可以通过元数据动态获取类的信息,实现对象创建、类型转换等功能
示例:元数据如何影响蓝图
UFUNCTION(BlueprintCallable, Category="MyHelloWorld", meta=(DisplayName="Hello World", Tooltip="输出helloworld"))
bool SayHelloWorld(float InValue)
通过元数据,蓝图编辑器会:
- 在“MyHelloWorld”分类下生成一个名为“Hello World”的节点
- 鼠标悬停时显示工具提示:“输出helloworld”
- 节点有一个浮点数输入引脚(对应 InValue 参数)和一个bool型输出引脚
为什么需要编译时生成?
-
性能优化:
- 元数据在编译时生成,避免了运行时动态解析代码的开销
-
跨平台兼容性:
- 不同平台的编译器可能对代码解析方式不同,UHT 统一生成元数据确保一致性
-
代码安全性:
- 元数据生成过程与编译流程绑定,避免手动维护错误
总结:
虚幻引擎的元数据是连接 C++ 代码与引擎运行时功能(如蓝图、编辑器工具)的桥梁通过编译时生成的元数据,引擎能够动态识别代码逻辑,并实现高度灵活的交互功能这是虚幻引擎“基于数据驱动设计”的核心机制之一