Unreal Engine 中 GENERATED_BODY()
的作用
1. 什么是 GENERATED_BODY()
?
GENERATED_BODY()
是一个由 Unreal Header Tool (UHT) 生成的宏。它的作用是:
- 为类生成必要的代码,以支持 Unreal 的反射系统。
- 使类能够被 Unreal 的序列化系统识别和处理。
- 提供对 Unreal 属性系统(
UPROPERTY
、UFUNCTION
等)的支持。
2. 为什么需要 GENERATED_BODY()
?
Unreal Engine 使用反射系统来动态获取类的信息(如属性、函数等)。反射系统是 Unreal 的核心功能之一,支持以下特性:
- 序列化:将对象的状态保存到磁盘或从磁盘加载。
- 蓝图集成:将 C++ 类暴露给蓝图。
- 编辑器支持:在 Unreal Editor 中显示和编辑类的属性。
- 网络复制:支持属性的网络复制(Replication)。
为了实现这些功能,Unreal 需要在编译时生成额外的代码。GENERATED_BODY()
就是这些生成代码的入口。
3. GENERATED_BODY()
的位置
GENERATED_BODY()
通常出现在类的声明中,紧跟在类名之后。例如:
UCLASS()
class MYGAME_API AMyActor : public AActor
{
GENERATED_BODY()
public:
// 类的成员函数和属性
};
对于继承自 UObject 的类,必须使用 GENERATED_BODY()。
对于非 UObject 类(如结构体或普通 C++ 类),通常不需要使用 GENERATED_BODY()。
4. GENERATED_BODY() 的作用
GENERATED_BODY() 宏会展开为一些自动生成的代码,主要包括:
类型信息:为类生成反射所需的类型信息(如类名、父类、属性列表等)。
构造函数:生成默认构造函数。
序列化支持:生成序列化函数(如 Serialize)。
反射支持:生成反射相关的函数(如 StaticClass)。
5. GENERATED_BODY() 的变体
Unreal Engine 提供了几种 GENERATED_BODY() 的变体,用于不同的场景:
(1) GENERATED_BODY()
默认版本,用于大多数 UObject 派生类。
(2) GENERATED_UCLASS_BODY()
旧版本的宏,用于 Unreal Engine 4 的早期版本。现在不推荐使用。
(3) GENERATED_BODY_LEGACY()
用于向后兼容旧代码。
(4) GENERATED_USTRUCT_BODY()
用于结构体(USTRUCT)。
6. 示例
以下是一个使用 GENERATED_BODY() 的完整示例:
// MyActor.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"
UCLASS()
class MYGAME_API AMyActor : public AActor
{
GENERATED_BODY()
public:
// 构造函数
AMyActor();
// 属性
UPROPERTY(EditAnywhere, Category = "MyCategory")
int32 MyProperty;
// 函数
UFUNCTION(BlueprintCallable, Category = "MyCategory")
void MyFunction();
};
在这个例子中:
GENERATED_BODY() 为 AMyActor 生成了反射和序列化所需的代码。
UPROPERTY 和 UFUNCTION 宏依赖于 GENERATED_BODY() 生成的代码。
7. 注意事项
必须包含 #include “MyClass.generated.h”:每个使用 GENERATED_BODY() 的类都必须包含其生成的头文件(通常是 ClassName.generated.h)。
不能手动修改生成的文件:GENERATED_BODY() 生成的代码位于 ClassName.generated.h 文件中,不要手动修改这些文件。
仅用于 UObject 派生类:普通 C++ 类或结构体不需要使用 GENERATED_BODY(),除非它们是 USTRUCT 或 UCLASS。
8. 总结
GENERATED_BODY() 是 Unreal Engine 中用于支持反射和序列化的关键宏。它的主要作用是:
生成反射所需的类型信息。
支持属性和函数的暴露(通过 UPROPERTY 和 UFUNCTION)。
提供序列化和编辑器集成的支持。
如果你在 Unreal 中创建 UObject 派生类,务必使用 GENERATED_BODY(),并确保包含生成的头文件(ClassName.generated.h)。