简介: CoreUObject 是 Unreal 的对象运行时基础设施,负责 UObject 的类型系统、反射、创建、加载、序列化与垃圾回收
核心作用
- UObject: UE 几乎一切可以反射对象的基础类,不是普通的 C++ 类
- UClass: 用于描述 UObject 类型本身的运行时类信息,UE 里的 类也是对象,例如它会记录 这个类叫什么、父类是谁、有哪些属性、有哪些函数、默认值是什么,Outer 允许什么类型、默认对象的 CDO 是谁、构造函数入口在哪。就类似于 C# 种的 obj.GetType() ,当然不完全是,因为UE的这个还带有一些工厂能力,带有一些实际运行的函数
- 反射系统:让属性、函数、继承关系在运行时可见,支撑蓝图、编辑器、序列化、网络同步
- 对象创建/查找/加载: 典型入口是 NewObject、StaticFindObject、StaticLoadObject、LoadPackage
- CDO:(ClassDefaultObject) 每个 UClass 都有一个默认对象,很多初始化默认值都是从它而来
- GC:UObject 不靠普通 delete 管理,它是走引用追踪和垃圾回收
阅读记录
-> 表示继承自
UObject :不是最底层的基类,它的继承关系 UObject->UObjectBaseUtility->UobjectBase, 但是他的父类和祖类 源码注释都是不建议直接使用,所以可以理解为,祖类 UObjectBase 定义一些基础数据和语义,UObjectBaseUtility 封装了一些工具,UObject 就是对接我们可以使用的类,更像是一个文件的拆分,便于维护之类的,所以 UObject 就是UE 对象系统里最核心,最常用的公开根类。它里面基本都是 virtual 函数,更像是一个约定层
UClass:可以理解为记录 UObject 信息的类,继承关系是 UClass -> Ustruct -> UField -> UObject
UFunction:可以理解成为记录 函数信息的类,继承关系是 UFunction -> Ustruct -> UField -> UObject 可以看到继承关系和 UClass 差不多,它要记录的就是 函数名、参数列表、返回值、参数区大小、参数偏移、调用标志、native thunk 入口,显而易见,就是为了便于反射和对接蓝图。
FProperty:这个就是记录属性的信息,注意他的首字母不是 U 而是 F,继承关系是 FProperty -> FField,可以看到 他的继承链不属于 UObject 系列,它有很多的子类对应具体的类型,例如 FIntProperty、FBoolProperty、FObjectProperty 等。
typedef UObject WithinClass; :一般会用 UClass(Within=) 这个标签来设置,但是再 UObject 内是手动写的,大概率是因为 UObject 是基础根类,手写更兜底
UCLASS 和 UClass: UCLASS 是给 UHT 用的标记符号,定义在 UClass 同目录下的 ObjectMacros.h 文件内。UClass是 UHT 根据 UCLASS 标记生成反射注册代码,运行时组织出来的类对象。基本路径 UCLASS + GENERATED_BODDY -> UHT -> generated code -> UClass 对象。 类似 UCLASS 的还有 UFUNCTION、UPROPERTY 这些都是给 UHT 解析用的, UHT 负责生成反射注册代码,运行时再构建出 UClass、 UFunction 、FProperty
COREUOBJECT_API :这个不是给 UHT 解析用的,是用来标记 其所在的模块的 DLL 导出/导入 宏。用来做模块内的符号导出或导入,例如 COREUOBJECT_API 会由 UBT 根据实际的配置 展开成实际的导入导出代码,便于后期编译器编译和链接符号,他只是一个占位符 具体的内容 UBT 会根据不同的模块生成不同的 #define 例如
#define COREUOBJECT_API DLLEXPORT
或则
#define COREUOBJECT_API DLLIMPORT
又或者
#define COREUOBJECT_API “空”
- DECLARE_FUNCTION: 它不是普通的 C++ 函数,他是声明一个 Unreal 脚本执行包装函数,他的定义是可以直接跳转到的。普通的函数 UE 的蓝图、反射、脚本 等是不能直接调用的, 用这个宏封装后就可以支持他们的调用
#define DECLARE_FUNCTION(func) static void func( UObject* Context, FFrame& Stack, RESULT_DECL )
FObjectInitializer :UObject 构造时的工具类,它是 UObject 构造阶段的上下文对象, 帮助 UE 完成 默认值初始化和默认子对象的初始化,他会沿着 Super(ObjectInitializer) 这条继承链一路上传。 UObject 的构造阶段处理了很多事情,例如 分配对象内存,设置基础对象头,建立类信息,拷贝默认值,处理子对象、等,所以需要一个 上下文类来帮助构建
NewObject UE 提供的全局创建 UObject 的API,声明在 UObjectGlobals.h 里面 ,它是一个主要的创建 UObject 的入口,类似的全局函数还有 StaticFindObject、StaticLoadObject、LoadPackage 这些都是全局入口
GetClass():用于获取 UObject 背后的 类对象,这个函数是定义在 UObjectBase.h 内的,然后 UObject 通过继承获得它,它应该比较常用,因为 UClass 是用来记录实际的 UObject 的一些相关数据的,可以用于 反射 等。