前言
- 文章之后会修改.
最近一些文章互相关联性较高, 可能随着某篇文章某些内容的深扒, 而导致一些内容更连贯, 并对所有相关内容进行修改 - 源码版本4.22
大钊:《InsideUE4》UObject(六)类型系统代码生成重构-UE4CodeGen_Private
在前面的文章中,我们对一个空UObject类进行了一系列的分析, 那么如果不是空类呢?
这就是这篇文章的内容了,内容较多且繁杂, 如果前面掌握不太好,那就回去复习!
同时内容较多, 受限于篇幅, 可能会省略掉很多对比等实际操作.
请根据步骤一步一步跟做, 不保证教会, 但保证看懂。
属性篇 第一节
![f7a0461989045dd7ab1e07476ac291b9.png](https://img-blog.csdnimg.cn/img_convert/f7a0461989045dd7ab1e07476ac291b9.png)
添加一个float的成员变量, 重新生成项目, 然后与空类(UGAObject01)generated.h和generated.cpp进行对比。
// 后文简称与头文件(generated.h)或者实现文件(generated.cpp)
没有发现任何显著变化, 可以认为无变化。
属性篇 第二节
![21e261b0f90fe08385cf199e7dbbc724.png](https://img-blog.csdnimg.cn/img_convert/21e261b0f90fe08385cf199e7dbbc724.png)
添加U宏标记, 与空类对比, 进行同样的步骤。
与头文件对比, 无明显变化
与实现文件相比, Z_Construct_UClass_UGAObject05_Statics这个反射信息结构体发生很大的变化
![74ff56652679ba1bee52093a7fd6598a.png](https://img-blog.csdnimg.cn/img_convert/74ff56652679ba1bee52093a7fd6598a.png)
- NewProp_TestFloatValue_MetaData
![71eb11b9dfb1e038cea5c510392a66ef.png](https://img-blog.csdnimg.cn/img_convert/71eb11b9dfb1e038cea5c510392a66ef.png)
名称直译, 新的属性_属性名称_元数据
这里是收集属性对应的元数据
- NewProp_TestFloatValue
![7c0ce36bf5b1af46f6f32c3364186f43.png](https://img-blog.csdnimg.cn/img_convert/7c0ce36bf5b1af46f6f32c3364186f43.png)
从数据上看, 可以轻易的出, 这是这个属性对应的反射信息
![7cc33f1654539a29187b8567a0bbff96.png](https://img-blog.csdnimg.cn/img_convert/7cc33f1654539a29187b8567a0bbff96.png)
跳一下结构体, 可以看到是FGenericPropertyParam这个结构体
![2f0605675c958d4baf1a6997a6ba489a.png](https://img-blog.csdnimg.cn/img_convert/2f0605675c958d4baf1a6997a6ba489a.png)
属性值一一对应
这里只分析部分, 一些内容等用到的时候再分析.
NameUTF8 : 属性名称
PropertyFlags : 这个属性(EPropertyFlags)0x0010000000000000, 值实际是CPF_NativeAccessSpecifierPublic
Flags : 这个属性标记类属性的类别, 是个枚举, 这里是float
总共有下列这么多情况, 也就是说下面这些是所有可以加U宏的属性类型
![6cd86d07624683cd8230c7fc8baa3e88.png](https://img-blog.csdnimg.cn/img_convert/6cd86d07624683cd8230c7fc8baa3e88.png)
- PropPointers
![3396d82dd09b8763efff8b9cfece2072.png](https://img-blog.csdnimg.cn/img_convert/3396d82dd09b8763efff8b9cfece2072.png)
![88e644b2ede491de4d6efb0b2df862c4.png](https://img-blog.csdnimg.cn/img_convert/88e644b2ede491de4d6efb0b2df862c4.png)
可以看到是一个FPropertyParamsBase指针数组, 存储多个反射参数信息的指针
参考注释内容, FPropertyParamsBase只是规定了常见初始序列, 及前几个内容是这几个属性, 其他的多多少少, 会根据不同情况, 做一些拓展.
FPropertyParamsBaseWithOffset在FPropertyParamsBase的基础上多了属性偏移一个int32值
FGenericPropertyParams又在FPropertyParamsBaseWithOffset的基础上多了元数据信息
所以, 存储一个最基础信息的数据, 根据EPropertyGenFlags获得实际的类型, 就能生成对应的变量信息
上述内容就可以得到属性的反射信息, 那么怎么管理到Class上面呢?
![ee803b57922782bf845dd6df66844fb4.png](https://img-blog.csdnimg.cn/img_convert/ee803b57922782bf845dd6df66844fb4.png)
如上, 传入Class反射参数一个属性反射信息数组和相应数量
至此, 这个float值, 反射信息就被记录并可以合理生成了.