我们知道,在java里有一个东西叫注解。注解的使用在spring框架里更是被用的出神入化。那么C++里呢?有没有对类进行说明的类型
第一种类说明符:Abstract。抽象类说明符将类声明为 “抽象基类”, 防止用户在虚幻编辑器中向世界添加此类的参与者, 或在游戏中创建此类的实例。
第二种类说明符:AdvancedClassDisplay。该说明符强制类的所有属性只显示在 “详细信息” 面板的 “高级” 部分中, 默认情况下隐藏在 “视图” 中。
类说明符和元数据修饰符又有什么不同?
参考:https://zhuanlan.zhihu.com/p/620138142
UClass也是一个基于UObject的类。 UClass是一个用于元/反射的类。那么UCLASS()不就相当于是一个对象吗?
参考:https://zhuanlan.zhihu.com/p/630963028
元/反射是大型游戏引擎的常见部分,但本身并未内置C++。一些编程语言构建了元数据和反射功能,C#和Java。
因为元数据/反射不是内置于C++所以原生游戏引擎需要找到一种方法来反映这些数据。用UCLASS()这样的语法标记你的类,用UFUNCTION()标记你的方法,用UPROPERTY()标记属性,是明确定义哪些数据/方法将被反映的好方法。
给类加上UCLASS标记的好处:在编译过程中,他们会预处理您的头文件并生成一个新的头文件“yourfilename.generated.h”,其中包括您标记的所有必要反射数据。然后,他们运行编译过程的其余部分,一旦构建了二进制文件/dll,它们就会包含反射信息,整洁!
UCLASS([specifier, specifier, ...], [meta(key=value, key=value, ...)]) class ClassName : public ParentName { GENERATED_BODY() }
它是一种声明类。类声明定义类的名称、其继承的类,以及其继承的函数和变量。类声明还将定义通过 类说明符 和 元数据 要求的其他引擎和编辑器特定行为。
声明包含一个类的标准C++类声明。在标准声明之上,描述符(如类说明符和元数据)将被传递到 UCLASS 宏。它们用于创建被声明类的 UClass ,它可被看作引擎对类的专有表达。此外, GENERATED_BODY() 宏必须被放置在类体的最前方
可以把UCLASS看作是一个标记,使得UHT能够识别它,将它的信息识别后生成对应的类型信息。像UPROPERTY,UFUNCTION之类的宏,也是起到类似的作用。
参考:https://zhuanlan.zhihu.com/p/414736856(UE4反射 类型信息的生成)
参考:通过T:StaticClass()获得对应UObject的UClass的完整代码调用过程(https://blog.51cto.com/u_6871414/5896909)(DECLARE_CLASS和IMPLEMENT_CLASS)