当前位置: 首页 > news >正文

UE4/UE5反射系统动态注册机制解析 - 实践

UE4/UE5反射系统动态注册机制解析 - 实践

文章目录

  • 核心目标
  • 阶段一:静态收集(编译期)
    • 1. 宏的展开
    • 2. 注册到全局列表
  • 阶段二:动态注册(运行时)
    • 1.启动核心模块(CoreUObject)
    • 2.调用 Register() 函数
    • 3.处理依赖,有序初始化
    • 4.动态加载与循环
  • 总结与比喻


核心目标

UE需要实现一个跨模块(DLL)、支持热重载的反射系统。这意味着:

  1. 编译器需要知道所有UObject类的信息(类名、大小、属性、函数等)。

  2. 运行时需要按正确的顺序创建UClass对象,尤其是在不同DLL中的类可能存在依赖关系(例如Game.dll中的AMyCharacter继承自Engine.dll中的ACharacter)时,必须确保父类的UClass先于子类被创建


阶段一:静态收集(编译期)

这个过程发生在编译每个模块(如Engine.dll, Game.dll)的时候。

1. 宏的展开

假设我们在一个游戏项目中有一个类,定义在MyCharacter.h中:

UCLASS()
class AMyCharacter : public ACharacter
{

GENERATED_BODY()
// ... 其他成员 ...
};

在它的.cpp文件中,必然有对应的IMPLEMENT宏:

IMPLEMENT_CLASS(AMyCharacter, 12345) // 12345 是假设的CRC校验值

这个宏会被预处理器展开,其核心是创建一个静态全局变量

static TClassCompiledInDefer<AMyCharacter> AutoInitializeAMyCharacter(