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


核心目标

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(

posted on 2025-11-18 20:52  slgkaifa  阅读(13)  评论(0)    收藏  举报

导航