虚幻引擎如何实现UPROPERTY宏?

Sho*_*out 6 c++ unreal-engine4 unreal-engine5

我想UPROPERTY()在我的项目中实现类似宏的东西,但我找不到任何关于它实际是什么的参考。我的意思是,有关于这个宏如何工作的教程,但这些只是用例。

编译器如何知道UPROPERTY()引用了它下面的变量?

例子:

UPROPERTY(EditAnywhere)
int x = 0;
Run Code Online (Sandbox Code Playgroud)

我知道虚幻是开源的,但它的代码库非常庞大。

Max*_*lay 8

UPROPERTY不是真正的 C++ 宏。它看起来像一个,因此编译器接受它,但实际上虚幻标头工具(UHT)使用它来创建代码,然后将其添加到GENERATED_BODY类的代码中。UHT 是一个解析器,它只获取所有代码并搜索所有这些UCLASSUPROPERTYUFUNCTION等声明,然后为其生成正确的代码,然后将其放入“XXX.generate.h”和“XXX.generate”中.cpp”您包含的文件。例如,如果您希望变量可通过蓝图读取,则会创建一个 getter 逻辑以允许蓝图逻辑调用它。

因此编译器实际上并不知道 a 是什么UPROPERTY,因为预处理器由于它没有实际的主体而完全删除了它。

如果您想深入了解 UHT 的工作原理,您应该查看其代码。您还可以在那里修改它以满足您的需求,包括自定义代码生成。


关于 Unreal 中的宏的旁注:Unreal 中的 Slate 框架实际上使用宏来生成大量样板代码,而无需 Unreal 标头工具。也许研究它会给你一些见解。但它们与 UHT 生成代码的能力并不相同。