Unreal Engine 中 `GENERATED_BODY()` 的作用

Unreal Engine 中 GENERATED_BODY() 的作用

1. 什么是 GENERATED_BODY()

GENERATED_BODY() 是一个由 Unreal Header Tool (UHT) 生成的宏。它的作用是:

  • 为类生成必要的代码,以支持 Unreal 的反射系统。
  • 使类能够被 Unreal 的序列化系统识别和处理。
  • 提供对 Unreal 属性系统(UPROPERTYUFUNCTION 等)的支持。

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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值