UE C++ 代码上构建反射
一. 反射如何具体到代码上
我们读了那么多反射的概念,反射的理念作用。但具体到代码上,总感觉空的,虚的。有神而没有行。今天我们就简单的从最基本的代码理解反射,这也是今天从一个视频上学来的,结合上最近反射的理论学习觉得很有意思。
二.首先构造None
1.这个是在UE里构建一个最简单的类,它本身是没有反射的。我们叫他SimpleClass

2.在这个类里面需要,修改它是个 空的C++类需要将它,改成有反射的类。首先是让它继承自UObject。所有需要反射的都要继承UObject,因为这样你才能使用里面设计好的反射基础。
但是必须要改名字不然,不符合规则,所以前面加个U。那原先生成好的构造,析构也要一并改掉。
#include "CoreMinimal.h"/*** */
class THIRDLEARN_API USimpleClass : public UObject
{
public:USimpleClass();~USimpleClass();
};
3.这样能用了吗?还不行。每一个基于UObject类的实现类,都有对应的UClass用于存元数据等反射数据。
所以就算你一个方法不反射,一个变量也不反射。你的类至少得反射。所以C++类上面加个UClass
#include "CoreMinimal.h"/*** */
UCLASS()
class THIRDLEARN_API USimpleClass : public UObject
{
public:USimpleClass();~USimpleClass();
};
拓展(无关紧要)
问题来了,什么是元数据。
元数据(Metadata) 是用来给类、属性、函数等添加额外描述信息的。它本质上是一些不会直接影响运行逻辑,但会被编辑器、蓝图系统、序列化、文档生成、插件系统等工具使用的标签或注解。
✅ 元数据的作用概述
元数据是“数据的附加说明”,用来告诉 UE 编辑器/蓝图/工具“如何展示”“如何行为”“是否隐藏”等。
————————————————
版权声明:本文为CSDN博主「二进制备忘录」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_64798796/article/details/148711166
UClass 到底是啥
UE 创建对象用的不是 new 关键字,而是 NewObject 方法。MyObj 对象的类型是 UMyObject ,同时还有个伴随对象用于实现对象自省;这个伴随对象存放在 UMyObject 类的变量内,伴随对象的类型就是大名鼎鼎的 UClass(获取 UClass 对象请参考:GetClass 和 StaticClass)。UClass 主要就是为了实现虚幻引擎中的反射(又名类型系统)
注意:类型系统不仅仅是 UClass 一个类就能实现,它对应的是一整套系统。UClass 只是用来描述 UObject 对象;结构体、枚举、方法也得有对应的类来描述,分别是 UScriptStruct ,UEnum ,UFunction;同时还有各种基础类型的属性也需要描述,它们的基类是 FField
既然 UClass 都被设计出来,本着不用白不用的原则,其它一些跟类相关的元素也往这里面放;比如:类的继承关系,类的元数据,垃圾回收 ReferenceSchema 等
综合以上,UClass 有以下用处:
- 用于实现虚幻引擎中的反射系统(可用于 编辑器显示对象属性、序列化、性能优化和调试、蓝图脚本等调用C++方法等地方)
- 记录类的继承关系和类的 CastFlags,用于类之间的 Cast 转换
- 记录类的一些元数据,用于编辑器相关
- 生成当前类型 CDO 并保留引用
- 生成对象之间引用关系,用于垃圾回收
4.加了UClass后,还是不能用。因为那是运行时的反射,加载管理反射数据时用的。编译时,生成静态代码的反射你还没有,就是说生成基础代码C++给引擎用的你还缺。这部分就是 GENERATED_BODY()
#include "CoreMinimal.h"/*** */
UCLASS()
class THIRDLEARN_API USimpleClass : public UObject
{GENERATED_BODY()
public:USimpleClass();~USimpleClass();
};
5.如果你觉得这个就完事大吉那你又错了,UHT 也生成了 .generated.h。每次改类或属性时会重新生成,反应最新的元数据。它也属于静态表,也生成代码。我粗糙的觉得,它和Generated共同写静态代码,就像补充好了头文件,和定义的关系。
#include "CoreMinimal.h"
#include "SimpleClass.generated.h"
/*** */
UCLASS()
class THIRDLEARN_API USimpleClass : public UObject
{GENERATED_BODY()
public:USimpleClass();~USimpleClass();
};
现在终于能编过了,如果你像构造一个UStuct。那这些步骤和这个一样,以前学UStruct觉得奇怪,现在看来那不过是反射需要的最基本的格式罢了。
