UE4/UE5反射系统动态注册机制解析 - 实践
文章目录
核心目标
UE需要实现一个跨模块(DLL)、支持热重载的反射系统。这意味着:
编译器需要知道所有UObject类的信息(类名、大小、属性、函数等)。
运行时需要按正确的顺序创建
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(
浙公网安备 33010602011771号